我正在使用一些代码逐行读取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中。有人可以帮我解决这个问题吗?
答案 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个元素,并且此实例中的其余字符将在返回的最后一个元素中返回值。