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

本文关键字:复制 excel 单词 取文本 何读 文件 | 更新日期: 2023-09-27 18:36:25

>我有一个如下所示的文本文件

名称:xxxx 地址:xxxxx 联系人号码:xxx 网卡编号:xxxx

在单个字符串中。我想读取文本文件并仅使用 c# 将姓名地址联系电话和 NIC no 提取到 excel 表中。

我能够读取整个字符串并将其保存到 excel 表中。

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

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

如果所有这些行都具有相同的字段标签和字段顺序,则可以使用正则表达式来解析该行:

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
}

此正则表达式使用字段标签("名称:"、"地址:"等)来查找所需的值。's*部分意味着忽略值周围的任何空格。(.*)部分将值捕获到匹配类中的组中,从 1 开始计数。

如果您的姓名、地址联系人号码等字段使用制表符分隔符 (''t) 分隔,那么您可以使用制表符分隔符拆分字符串,如下所示:

string.Split(''t');

您可以使用文本文件的任何分隔符代替't

如果您有空格,则可能会遇到问题,因为字段和字段值之间可能有空格。

不清楚每个文件中是否只有一条记录。假设单个文件中的数据是:

名称:N1 地址:A1 W. X, Y - Z 联络号码: C1 网卡号码:

I1 名称:N2 地址:A2 W. X, Y - Z 联络号码: C2 网卡号码: I2

所以一行上有 2 条记录(但可能还有更多)

名称:N1 地址:A1 W. X, Y - Z 联系人号码: C1 网卡编号: I1

名称:N2 地址:A2 W. X, Y - Z 联系人号码: C2 网卡编号: I2

我不认为用空格分割是实用的,因为名称和地址等字段可能包含空格。理想情况下,冒号符号(:)仅用作键和值之间的分隔符,并且不在任何值中使用。否则,解决方案会变得更加复杂。

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

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));

对于每个有记录的文件,打开文件,读取文件内容并"处理"它:

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);
   } 
}

如果每个文件仅包含一条记录,这也将起作用。现在,您在数据表中拥有结构化数据,应该很容易将它们插入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");
    }
}

}