4

我有一个分隔符为“|”的 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 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 行。有什么方法可以将它们读取为同一行而不是 2 个不同的行?或者我是否必须使用逗号或分号等分隔符才能将它们标识为同一行?

4

4 回答 4

3

使用支持您需要的所有功能的库,例如A Fast CSV Reader 。

于 2013-03-26T08:30:52.243 回答
2

List(of T) 也可以通过索引访问,您可以在循环中添加一个 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 提供的样本数据进行了测试,它似乎运行良好。

于 2013-03-26T08:37:16.427 回答
0

根据 CSV 文件规范,每条记录应位于单独的行上(您可以在此处找到 CSV 文件规范http://www.ietf.org/rfc/rfc4180.txt)。因此,在您的情况下,您确实需要采取某种解决方法并使用其他分隔符来标记换行符。

于 2013-03-26T08:33:38.307 回答
0

我使用FileHelpers Library直接映射到强类型数组。如果您正在使用正式的 CSV,它将为您工作。

如果它只是没有正式规范的分隔数据,您可能需要一些其他解决方案。

于 2013-03-26T08:40:28.463 回答