如何读取文本文件中的特定单词并将其复制到Excel中?

我有一个文本文件,如下所示

名称:xxxx地址:xxxxx联系号码:xxx NIC号码:xxxx

在一个单一的string。 我想读取文本文件,并提取只有名称地址联系电话号码和NIC没有使用C#到一个Excel工作表。

我能够读取整个string并将其保存到Excel表格中。

显然,您已经知道如何读取文本文件以及如何写入Excel。 仍然存在如何将行分割成单独的值的问题。

如果所有这些行具有相同的字段标签和字段顺序,则可以使用正则expression式来parsing行:

string line = "Name: xx xx Address:yyy yyYY Contact No: 1234 NIC No: xXxX"; var regex = new Regex(@"Name:\s*(.*)\s*Address:\s*(.*)\s*Contact No:\s*(.*)\s*NIC No:\s*(.*)\s*"); var match = regex.Match(line); if (match.Success) { var name = match.Groups[1].Value; var address = match.Groups[2].Value; var contactNo = match.Groups[3].Value; var nic = match.Groups[4].Value; // TODO write these fields to Excel } 

这个正则expression式使用字段标签(“Name:”,“Address:”等)来查找所需的值。 \s*部分意味着值的任何空格被忽略。 (.*)部分将值捕获到匹配类中的组中,从1开始计数。

如果您的名字,地址联系号码等字段使用制表符分隔符(\ t)分隔,那么您可以使用制表符分隔符来分隔string,如下所示:

 string.Split('\t'); 

而不是你可以使用任何分隔符是否有文本文件。

如果你有一个空间,那么你可能有问题,因为字段和字段值之间可能有空格。

目前还不清楚每个文件中是否只有一个logging。 假设您的数据在一个文件中是:

名称:N1地址:A1 W. X,Y – Z联系电话:C1 NIC编号:I1名称:N2地址:A2 W. X,Y – Z联系电话:C2 NIC编号:I2

所以在一条线上有两条logging(但是可能会有更多)

名称:N1地址:A1 W. X,Y – Z联系电话:C1 NIC编号:I1

名称:N2地址:A2 W. X,Y – Z联系号码:C2 NIC编号:I2

我不认为用空格分隔是可行的,因为像名称和地址这样的字段可能包含空格。 理想情况下,冒号符号(:)仅用作键和值之间的分隔符,并不用于任何值。 否则解决scheme会变得更复杂。

另外,我假定键的顺序保证如上例所示:

 Name Address Contact No NIC No 

使用自定义对象或DataTable的列表来保存您的结构化数据。 在这个例子中,我将使用DataTable

 var separators = new char[] { ':' }; var data = new DataTable(); data.Columns.Add("Name", typeof(string)); data.Columns.Add("Address", typeof(string)); data.Columns.Add("ContractNo", typeof(string)); data.Columns.Add("NICNo", typeof(string)); 

对于每个带有logging的文件,打开文件,读取文件内容并“处理”它:

 foreach (string fileName in fileNames) { //read file content string fileContent = ...; string[] tokens = fileContent.Split(separators); //we skip first token. It will always be 'Name'. for(int i = 0; i < (tokens - 1) / 4; i++) { var record = data.NewRow(); string token = tokens[i * 4 + 1]; record["Name"] = token.Substring(0, token.Lenght - 7).Trim(); // Remove 'Address' from end and trim spaces token = tokens[i * 4 + 2]; record["Address"] = token.Substring(0, token.Length - 10).Trim(); //Remove 'Contact No' from end and trim spaces token = tokens[i * 4 + 3]; record["ContractNo"] = token.Substring(0, token.Length - 6).Trim(); //Remove 'NIC No' from end and trim spaces token = tokens[i * 4 + 4]; if (token.EndsWith('Name')) //if there are multiple records token = token.Substring(0, token.Length - 4); record["NICNo"] = token.Trim(); data.Rows.Add(record); } } 

这也将工作,如果每个文件只包含一个logging。 现在,您在数据表中具有结构化数据,应该很容易将它们插入到Excel工作表中。

  static void Main(string[] args) { //Application.WorkbookBeforeSave += new Excel.AppEvents_WorkbookBeforeSaveEventHandler(Application_WorkbookBeforeSave); string mydocpath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); System.Data.DataTable dt = new System.Data.DataTable(); dt.Columns.Add("Name"); dt.Columns.Add("Address"); dt.Columns.Add("Contact No"); dt.Columns.Add("NIC"); foreach (string txtName in Directory.GetFiles(@"D:\unityapp\tab02", "*.txt")) { StreamReader sr = new StreamReader(txtName); //string line = "Name: Address: Contact No: NIC No:"; string[] token1 = sr.ReadLine().Split(new string[] { "Name: ", "Address: ", "Contact No: ", "NIC No:" }, StringSplitOptions.None); dt.Rows.Add(token1[1], token1[2], token1[3], token1[4]); } Microsoft.Office.Interop.Excel.Application x = new Microsoft.Office.Interop.Excel.Application(); // Workbook wb = x.Workbooks.Open(@"C:\Book1.xlsx"); Workbook wb = x.Workbooks.Add(); Worksheet sheet = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.get_Item(1); // Microsoft.Office.Interop.Excel.Workbook wb = new Microsoft.Office.Interop.Excel.Workbook(); // Microsoft.Office.Interop.Excel.Worksheet sheet = new Microsoft.Office.Interop.Excel.Worksheet(); sheet.Cells[1, 1] = "Name"; sheet.Cells[1, 1].Interior.ColorIndex = 10; sheet.Cells[1, 2] = "Address"; sheet.Cells[1, 2].Interior.ColorIndex = 20; sheet.Cells[1, 3] = "Contact No"; sheet.Cells[1, 3].Interior.ColorIndex = 30; sheet.Cells[1, 4] = "NIC"; sheet.Cells[1, 4].Interior.ColorIndex = 40; int rowCounter = 2; int columnCounter = 1; foreach (DataRow dr in dt.Rows) { sheet.Cells[rowCounter, columnCounter] = dr["Name"].ToString(); columnCounter += 1; sheet.Cells[rowCounter, columnCounter] = dr["Address"].ToString(); columnCounter += 1; sheet.Cells[rowCounter, columnCounter] = dr["Contact No"].ToString(); columnCounter += 1; sheet.Cells[rowCounter, columnCounter] = dr["NIC"].ToString(); rowCounter += 1; columnCounter = 1; } wb.SaveAs(@"D:\Unity.xlsx"); wb.Close(); x.Quit(); Process.Start(@"D:\Unity.xlsx"); } } 

}