从C#中的csv文件读取时忽略一些文件分隔符号

时间:2014-05-27 15:36:55

标签: c# csv

我正在使用一些代码逐行读取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中。有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

您可以修剪最后一个逗号,并使用需要返回最多元素数的overload of Split

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

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

来自MSDN:

  

如果此实例中有多个count子串,则第一个计数减1个子字符串将在第一个计数中返回返回值的1个元素,并且此实例中的其余字符将在返回的最后一个元素中返回值。