如何读取文本文件中的特定单词并将其复制到 excel 中
本文关键字:复制 excel 单词 取文本 何读 文件 | 更新日期: 2023-09-27 18:36:25
>我有一个如下所示的文本文件
名称:xxxx 地址:xxxxx 联系人号码:xxx 网卡编号:xxxx
在单个字符串中。我想读取文本文件并仅使用 c# 将姓名地址联系电话和 NIC no 提取到 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");
}
}
}