解析带有未转义多行字段的分隔文件
本文关键字:字段 分隔 文件 转义 | 更新日期: 2023-09-27 18:05:58
我有一个CSV文件,它有一个"|"分隔符来分隔字段。
我使用下面的代码读取文件并将其放入List
var reader = new StreamReader(File.OpenRead(openFileDialog1.FileName));
List<string> list1 = new List<string>();
List<string> list2 = new List<string>();
List<string> list3 = new List<string>();
List<string> list4 = new List<string>();
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
var values = line.Split('|');
list1.Add(values[0]);
list2.Add(values[1]);
list3.Add(values[2]);
list4.Add(values[3]);
}
然后我将它放入DataSet
DataSet ds = new DataSet();
ds.Tables.Add("barcode");
for (int i = 1; i < list1.Count; i++)
{
ds.Tables[0].Rows.Add(list1[i], list2[i], list3[i], list4[i]);
}
如果数据是这样的,那就太好了
373|A0000006-04|EACH|2600003347225
373|A0000006-04|EACH|9556076004684
373|A0000006-04|EACH|9556076006374
373|A0000006-04|PK12|2600003347232
373|A0000006-04|PK12|9556076004691
然而,一些数据可能看起来像这样
373|A0000029-01|PK12|1899886
6604250
373|A0000029-01|PK12|2652357563394
373|A0000030-01|EACH|2600001
539189
373|A0000030-01|EACH|8998866604284
如您所见,有些数据使用2行。有没有办法把它们读成同一行而不是两行?或者我是否必须使用逗号或分号等分隔符来将它们标识为同一行?
使用支持所需所有功能的库,如a Fast CSV Reader
List(of T)也可以通过index访问,您可以在循环中添加lineCounter如果该行在分割后仅由一部分组成,则将内容添加到前一个列表元素中。(至少第一行应该有4个元素)
lineCounter = 0;
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
var values = line.Split('|');
if(values.Length == 1)
{
list4[lineCounter-1] += values[0];
}
else
{
list1.Add(values[0]);
list2.Add(values[1]);
list3.Add(values[2]);
list4.Add(values[3]);
lineCounter++;
}
}
我用OP提供的样本数据进行了测试,似乎工作得很好。
根据CSV文件规范,每个记录应该位于单独的行(您可以在这里找到CSV文件规范http://www.ietf.org/rfc/rfc4180.txt)。所以在你的情况下,你真的需要做一些变通和使用其他分隔符来标记换行
我使用FileHelpers库直接映射到强类型数组。如果您正在使用正式的CSV,它将为您工作。
如果它只是分隔的数据,没有正式的规范,您可能需要其他解决方案。