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

时间:2015-01-05 08:04:53

标签: c# excel text-files

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

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

在一个字符串中。 我想阅读文本文件并仅提取名称地址联系人号码和NIC不使用c#到Excel工作表中。

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

4 个答案:

答案 0 :(得分:1)

显然,您已经知道如何阅读文本文件以及如何写入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开始计算。

答案 1 :(得分:0)

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

string.Split('\t');

而不是\t,您可以使用任何分隔符,即文本文件。

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

答案 2 :(得分:0)

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

  

名称:N1地址:A1 W. X,Y - Z联系号码:C1 NIC号码:I1名称:N2地址:A2 W. X,Y - Z联系号码:C2 NIC号码:I2

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

  

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

     

名称:N2地址:A2 W. X,Y - Z联系号码:C2 NIC号码: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工作表中。

答案 3 :(得分:0)

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

}

}