|
@@ -0,0 +1,450 @@
|
|
|
|
+using System;
|
|
|
|
+using System.Collections.Generic;
|
|
|
|
+using System.ComponentModel;
|
|
|
|
+using System.Data;
|
|
|
|
+using System.Drawing;
|
|
|
|
+using System.Linq;
|
|
|
|
+using System.Text;
|
|
|
|
+using System.Threading.Tasks;
|
|
|
|
+using System.Windows.Forms;
|
|
|
|
+using System.IO;
|
|
|
|
+using log = Log.Log;
|
|
|
|
+using Excel = Microsoft.Office.Interop.Excel;
|
|
|
|
+
|
|
|
|
+namespace frequency
|
|
|
|
+{
|
|
|
|
+ public partial class Form1 : Form
|
|
|
|
+ {
|
|
|
|
+ public Form1()
|
|
|
|
+ {
|
|
|
|
+ log.Init("frequency.log");
|
|
|
|
+ path = System.Environment.CurrentDirectory;
|
|
|
|
+ InitializeComponent();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private string[] originTextsOrder;
|
|
|
|
+ private string[] originTextsInverse;
|
|
|
|
+ private string[] targetTexts;
|
|
|
|
+
|
|
|
|
+ private void SelectOriginButton(object sender, EventArgs e)
|
|
|
|
+ {
|
|
|
|
+ var fileDialog = new OpenFileDialog();
|
|
|
|
+ fileDialog.Multiselect = false;
|
|
|
|
+ fileDialog.Title = "选择源文件";
|
|
|
|
+ if (fileDialog.ShowDialog() == DialogResult.OK)
|
|
|
|
+ {
|
|
|
|
+ this.originTextPath = fileDialog.FileName;
|
|
|
|
+ this.originText.Text = originTextPath;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void ShowOriginText(object sender, EventArgs e)
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void SelectTargetButton(object sender, EventArgs e)
|
|
|
|
+ {
|
|
|
|
+ var fileDialog = new OpenFileDialog();
|
|
|
|
+ fileDialog.Multiselect = false;
|
|
|
|
+ fileDialog.Title = "选择目标文件";
|
|
|
|
+ if (fileDialog.ShowDialog() == DialogResult.OK)
|
|
|
|
+ {
|
|
|
|
+ this.targetTextPath = fileDialog.FileName;
|
|
|
|
+ this.targetText.Text = this.targetTextPath;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void ShowTargetText(object sender, EventArgs e)
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void Calculate_Click(object sender, EventArgs e)
|
|
|
|
+ {
|
|
|
|
+ this.label1.Text = "计算中...";
|
|
|
|
+ this.label1.Refresh();
|
|
|
|
+ this.calculate.Enabled = false;
|
|
|
|
+
|
|
|
|
+ var code = this.Calculate();
|
|
|
|
+ if (code != 0)
|
|
|
|
+ {
|
|
|
|
+ this.label1.Text = "计算出错";
|
|
|
|
+ this.label1.Refresh();
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ this.label1.Text = "计算完成";
|
|
|
|
+ this.label1.Refresh();
|
|
|
|
+ }
|
|
|
|
+ Application.DoEvents();
|
|
|
|
+ this.calculate.Enabled = true;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private int Calculate()
|
|
|
|
+ {
|
|
|
|
+ int code;
|
|
|
|
+ // read origin file
|
|
|
|
+ code = this.ReadOriginText();
|
|
|
|
+ if (code != 0)
|
|
|
|
+ {
|
|
|
|
+ log.E("Calculate_Click read origin file error with code: {0}", code);
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // read target file
|
|
|
|
+ code = this.ReadTargetText();
|
|
|
|
+ if (code != 0)
|
|
|
|
+ {
|
|
|
|
+ log.E("Calculate_Click read target file error with code: {0}", code);
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // clear target file
|
|
|
|
+ this.CleanTarget();
|
|
|
|
+
|
|
|
|
+ // look up
|
|
|
|
+ var result = this.Lookup();
|
|
|
|
+ log.D("Calculate_Click look up success with length: {0}", result.Count);
|
|
|
|
+
|
|
|
|
+ // write data to file
|
|
|
|
+ this.label1.Text = "导出数据中...";
|
|
|
|
+ this.label1.Refresh();
|
|
|
|
+
|
|
|
|
+ var msg = this.Write2Xlsx(result);
|
|
|
|
+ if ("" != msg)
|
|
|
|
+ {
|
|
|
|
+ log.E("Calculate_Click write data to xlsx error: {0}", msg);
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
|
|
+ log.D("Calculate_Click write data to xlsx success");
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void SeeResult_Click(object sender, EventArgs e)
|
|
|
|
+ {
|
|
|
|
+ try
|
|
|
|
+ {
|
|
|
|
+ System.Diagnostics.Process.Start("explorer.exe", path);
|
|
|
|
+ }
|
|
|
|
+ catch (Exception err)
|
|
|
|
+ {
|
|
|
|
+ MessageBox.Show(err.ToString());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 读取原始文件
|
|
|
|
+ private int ReadOriginText()
|
|
|
|
+ {
|
|
|
|
+ string[] texts;
|
|
|
|
+ try
|
|
|
|
+ {
|
|
|
|
+ texts = File.ReadAllLines(this.originTextPath);
|
|
|
|
+ }
|
|
|
|
+ catch (Exception err)
|
|
|
|
+ {
|
|
|
|
+ log.E("readOriginText with path: {0} error: {1}", this.originTextPath, err.ToString());
|
|
|
|
+ MessageBox.Show(err.ToString());
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
|
|
+ if (texts.Length < 1)
|
|
|
|
+ {
|
|
|
|
+ log.E("readOriginText with path: {0}, read file is empty", this.originTextPath);
|
|
|
|
+ MessageBox.Show("file is empty");
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ log.D("ReadOriginText received origin text with length: {0}", texts.Length);
|
|
|
|
+
|
|
|
|
+ // check
|
|
|
|
+ int length = 0;
|
|
|
|
+ for (int i = 0; i < texts.Length; i++)
|
|
|
|
+ {
|
|
|
|
+ var val = texts[i].Trim();
|
|
|
|
+ if (val.Length < 1)
|
|
|
|
+ {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ length++;
|
|
|
|
+ }
|
|
|
|
+ log.D("ReadOriginText received check text with length: {0}", length);
|
|
|
|
+
|
|
|
|
+ // append
|
|
|
|
+ var tempTexts = new string[length];
|
|
|
|
+ int index = 0;
|
|
|
|
+ for (int i = 0; i < texts.Length; i++)
|
|
|
|
+ {
|
|
|
|
+ var val = texts[i].Trim();
|
|
|
|
+ if (val.Length < 1)
|
|
|
|
+ {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ tempTexts[index++] = texts[i];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // combine
|
|
|
|
+ index = 0;
|
|
|
|
+ this.originTextsOrder = new string[(length * (length - 1)) / 2];
|
|
|
|
+ for (int i = 0; i < length; i++)
|
|
|
|
+ {
|
|
|
|
+ for (int j = i + 1; j < length; j++)
|
|
|
|
+ {
|
|
|
|
+ this.originTextsOrder[index++] = tempTexts[i] + "-" + tempTexts[j];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ index = 0;
|
|
|
|
+ this.originTextsInverse = new string[(length * (length - 1)) / 2];
|
|
|
|
+ for (int i = length - 1; i >= 0; i--)
|
|
|
|
+ {
|
|
|
|
+ for (int j = i - 1; j >= 0; j--)
|
|
|
|
+ {
|
|
|
|
+ this.originTextsInverse[index++] = tempTexts[i] + "-" + tempTexts[j];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ log.D("ReadOriginText read origin file success with order length: {0}, inverse length; {1}", this.originTextsOrder.Length, this.originTextsInverse.Length);
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 读取目标文件
|
|
|
|
+ private int ReadTargetText()
|
|
|
|
+ {
|
|
|
|
+ string[] texts;
|
|
|
|
+ try
|
|
|
|
+ {
|
|
|
|
+ texts = File.ReadAllLines(this.targetTextPath);
|
|
|
|
+ }
|
|
|
|
+ catch (Exception err)
|
|
|
|
+ {
|
|
|
|
+ log.E("ReadTargetText with path: {0} error: {1}", this.targetTextPath, err.ToString());
|
|
|
|
+ MessageBox.Show(err.ToString());
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
|
|
+ if (texts.Length < 1)
|
|
|
|
+ {
|
|
|
|
+ log.E("ReadTargetText with path: {0}, read file is empty", this.targetTextPath);
|
|
|
|
+ MessageBox.Show("file is empty");
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
|
|
+ log.D("ReadTargetText read texts: {0}", texts);
|
|
|
|
+ // check
|
|
|
|
+ int length = 0;
|
|
|
|
+ for (int i = 0; i < texts.Length; i++)
|
|
|
|
+ {
|
|
|
|
+ var val = texts[i].Trim();
|
|
|
|
+ if (val.Length < 1 || !val.Contains("-"))
|
|
|
|
+ {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ length++;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // append
|
|
|
|
+ this.targetTexts = new string[length];
|
|
|
|
+ var index = 0;
|
|
|
|
+ for (int i = 0; i < texts.Length; i++)
|
|
|
|
+ {
|
|
|
|
+ var val = texts[i].Trim();
|
|
|
|
+ if (val.Length < 1 || !val.Contains("-"))
|
|
|
|
+ {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ this.targetTexts[index++] = texts[i];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * desc
|
|
|
|
+ * 1. 目标文件中的字符串形如54#01(100#)--54#02,其中括号以及括号的内容清除不计。
|
|
|
|
+ * 2. 源文件两两组合的后的字符串再到目标文件中查找,所有单个的字符串都可以忽略不计算;如58#01可以忽略不计。
|
|
|
|
+ */
|
|
|
|
+ private void CleanTarget()
|
|
|
|
+ {
|
|
|
|
+ var originLength = this.targetTexts.Length;
|
|
|
|
+ string[] tempStrings = new string[this.targetTexts.Length];
|
|
|
|
+ var index = 0;
|
|
|
|
+ for (int i = 0; i < this.targetTexts.Length; i++)
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ var val = this.targetTexts[i].Trim();
|
|
|
|
+ if (val.Length < 1)
|
|
|
|
+ {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ if (!val.Contains("-"))
|
|
|
|
+ {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var clearStr = ClearString(val);
|
|
|
|
+ tempStrings[index++] = clearStr;
|
|
|
|
+ }
|
|
|
|
+ this.targetTexts = new string[index];
|
|
|
|
+ for (int i = 0; i < index; i++)
|
|
|
|
+ {
|
|
|
|
+ this.targetTexts[i] = tempStrings[i];
|
|
|
|
+ }
|
|
|
|
+ log.D("CleanTarget clean target origin length {0} success with last length: {1}", originLength, this.targetTexts.Length);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private string ClearString(string str)
|
|
|
|
+ {
|
|
|
|
+ if (!str.Contains("("))
|
|
|
|
+ {
|
|
|
|
+ return str;
|
|
|
|
+ }
|
|
|
|
+ string result = "";
|
|
|
|
+ bool had = false;
|
|
|
|
+ for (int i = 0; i < str.Length; i++)
|
|
|
|
+ {
|
|
|
|
+ if (had && str[i] != ')')
|
|
|
|
+ {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ if (had && str[i] == ')')
|
|
|
|
+ {
|
|
|
|
+ had = false;
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ if (str[i] == '(')
|
|
|
|
+ {
|
|
|
|
+ had = true;
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ result += str[i];
|
|
|
|
+ }
|
|
|
|
+ return ClearString(result);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ private Dictionary<string, int> Lookup()
|
|
|
|
+ {
|
|
|
|
+ this.currentIndex = 0;
|
|
|
|
+ this.totalNum = this.originTextsOrder.Length + this.originTextsInverse.Length;
|
|
|
|
+ Dictionary<string, int> result = new Dictionary<string, int>();
|
|
|
|
+ for (int i = 0; i < this.originTextsOrder.Length; i++)
|
|
|
|
+ {
|
|
|
|
+ for (int j = 0; j < this.targetTexts.Length; j++)
|
|
|
|
+ {
|
|
|
|
+ this.currentIndex++;
|
|
|
|
+ if (judge(this.originTextsOrder[i], this.targetTexts[j]))
|
|
|
|
+ {
|
|
|
|
+ var key = this.originTextsOrder[i];
|
|
|
|
+ if (result.ContainsKey(key))
|
|
|
|
+ {
|
|
|
|
+ result[key] = result[key] + 1;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ result[key] = 1;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < this.originTextsInverse.Length; i++)
|
|
|
|
+ {
|
|
|
|
+ for (int j = 0; j < this.targetTexts.Length; j++)
|
|
|
|
+ {
|
|
|
|
+ this.currentIndex++;
|
|
|
|
+ if (judge(this.originTextsInverse[i], this.targetTexts[j]))
|
|
|
|
+ {
|
|
|
|
+ var key = this.originTextsInverse[i];
|
|
|
|
+ if (result.ContainsKey(key))
|
|
|
|
+ {
|
|
|
|
+ result[key] = result[key] + 1;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ result[key] = 1;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private bool judge(string origin, string target)
|
|
|
|
+ {
|
|
|
|
+ var strs = origin.Split('-');
|
|
|
|
+ if (strs.Length < 2)
|
|
|
|
+ {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ if ((strs[0] + "-" + strs[1] == target) || (strs[0] + "--" + strs[1] == target))
|
|
|
|
+ {
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void label1_Click(object sender, EventArgs e)
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ private string Write2Xlsx(Dictionary<string, int> data)
|
|
|
|
+ {
|
|
|
|
+ var suffix = DateTime.Now.ToString("yyyy-MM-dd-HH-mm") + ".xlsx";
|
|
|
|
+ var filename = Path.Combine(path, suffix);
|
|
|
|
+ Excel.Application app = new Excel.Application();
|
|
|
|
+ Excel.Workbook doc = app.Workbooks.Add(Type.Missing);
|
|
|
|
+ if (doc.Worksheets.Count < 1)
|
|
|
|
+ {
|
|
|
|
+ doc.Worksheets.Add(Type.Missing, Type.Missing, Type.Missing);
|
|
|
|
+ }
|
|
|
|
+ Excel.Worksheet sheet = doc.ActiveSheet;
|
|
|
|
+
|
|
|
|
+ var index = 1;
|
|
|
|
+ foreach (var val in data)
|
|
|
|
+ {
|
|
|
|
+ sheet.Cells[index, 1] = val.Key;
|
|
|
|
+ sheet.Cells[index, 2] = val.Value;
|
|
|
|
+ index++;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //sheet.Cells[1, 1] = "Name";
|
|
|
|
+ //sheet.Cells[1, 2] = "Sex";
|
|
|
|
+ //for (int i = 2; i < 5; i++)
|
|
|
|
+ //{
|
|
|
|
+ // sheet.Cells[i, 1] = "Name" + i;
|
|
|
|
+ // sheet.Cells[i, 2] = "Sex" + i;
|
|
|
|
+ //}
|
|
|
|
+
|
|
|
|
+ try
|
|
|
|
+ {
|
|
|
|
+ sheet.SaveAs(filename);
|
|
|
|
+ doc.Save();
|
|
|
|
+ doc.Close(Type.Missing, filename, Type.Missing);
|
|
|
|
+ app.Quit();
|
|
|
|
+ }
|
|
|
|
+ catch (Exception err)
|
|
|
|
+ {
|
|
|
|
+ log.E("Write2Xlsx write file({0}) error: {1}", filename, err.ToString());
|
|
|
|
+ return err.ToString();
|
|
|
|
+ }
|
|
|
|
+ log.D("Write2Xlsx write file({0}) success", filename);
|
|
|
|
+ return "";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void button1_Click(object sender, EventArgs e)
|
|
|
|
+ {
|
|
|
|
+ //this.Write2Xlsx();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void Form1_Load(object sender, EventArgs e)
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void showProgress()
|
|
|
|
+ {
|
|
|
|
+ while (true)
|
|
|
|
+ {
|
|
|
|
+ this.label1.Text = this.label1.Text;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|