【问题标题】:Ignoring some file separator symbols when reading from csv file in C#从 C# 中的 csv 文件读取时忽略一些文件分隔符
【发布时间】:2014-05-27 15:36:54
【问题描述】:

我正在使用一些代码逐行读取 csv 文件并识别每列中的字符串/值。应该总是有 5 列,最后一列总是空的(只是因为 csv 文件中每一行的末尾都有一个逗号)。 原始 csv 数据如下所示:

abc01.jpg,2729192,a2cbaad5,\Folder1\FolderA\,
abc02.jpg,1729127,b2cbaad4,\Folder1\FolderA\,
abc03.jpg,2759124,c2cbaad3,\Folder1\FolderA\,
abc04.jpg,3726126,d2cbaad2,\Folder2\FolderA,B\,
abc05.jpg,5721122,e2cbaad1,\Folder3\FolderA,B,C\,

我正在阅读的代码如下所示:

using (StreamReader reader = new StreamReader(csvFilePath))
{
    string missingCsvFilePath = rootFolderPath + "\\missing.csv";
    string line;
    while (!string.IsNullOrEmpty(line = reader.ReadLine()))
    {
       var splitval = line.Split(',');

       if (splitval.Length == 5)
       {
           string filename_csv = splitval[0];
           string crc_csv = splitval[2];
           string filepath_csv = splitval[3];

           Int64 filebytes_csv;
           bool parsed = Int64.TryParse(splitval[1], out filebytes_csv);
           //DO More processing
       }
       else
       {
           MessageBox.Show("Error: Line in Csv did not contain 5 sections");
           break;
       }
    }
}

我遇到的问题是有时第 4 列包含逗号(请参阅示例 csv 数据中的第 4 行和第 5 行),它们也是 csv 文件中的列分隔符。但是,第 4 列的开头和结尾总是有一个 \ 符号,因此可以安全地忽略 \ 符号之间的字符串中的逗号。但是,我确实需要逗号出现在字符串 filepath_csv 中。有人可以帮我实现吗?

【问题讨论】:

  • 我建议不要规避 CSV 中的错误,而是制作一个更好的 CSV。文件名通常用双引号 (") 括起来。
  • 我无法控制 csv 文件,因为它来自其他人
  • @SteveW:你有没有机会告诉他们他们的 CSV 不遵循约定?
  • 不——这是我无法控制的。问题实际上在于文件夹命名约定而不是它们的 csv 生成。

标签: c# csv


【解决方案1】:

您可以修剪最后一个逗号并使用 overload of Split 来返回最大数量的元素:

string[] parts = csvFilePath.TrimEnd(',')
                            .Split(new[] {','}, 4)

Yields:
----------
abc05.jpg 
5721122 
e2cbaad1 
\Folder3\FolderA,B,C\

来自 MSDN:

如果本实例的子串数超过count个,则在返回值的第一个count-1个元素中返回第一个count-1个子串,本实例中剩余的字符在return的最后一个元素中返回价值。

【讨论】:

  • var splitval = line.TrimEnd(',').Split(new[] { ',' }, 4);非常感谢。我不确定它是如何知道不分离最后一列的。它是否得到第一个 3,然后剩下的就是最后一列?
  • @SteveW 是的 - 从答案中的链接中阅读文档。
猜你喜欢
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
相关资源
最近更新 更多