我有一个文本文件,如下所示
名称:xxxx地址:xxxxx联系号码:xxx NIC号码:xxxx
在一个字符串中。 我想阅读文本文件并仅提取名称地址联系人号码和NIC不使用c#到Excel工作表中。
我能够读取整个字符串并将其保存到Excel工作表中。
答案 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");
}
}
}