CSV更改分隔符

3
我正在读取一个CSV文件,并将分隔符从“,”更改为“|”。然而,我注意到在我的数据中(我对其没有控制权),在某些情况下,我有一些数据不想遵循这个规则,它包含带逗号的引用数据。我想知道如何最好地不替换这些异常情况?
例如:
ABSON TE,Wick Lane,"Abson, Pucklechurch",Bristol,Avon,ENGLAND,BS16 9SD,37030,17563,BS0001A1,,
应该被更改为:
ABSON TE|Wick Lane|"Abson, Pucklechurch"|Bristol|Avon|ENGLAND|BS16 9SD|37030|17563|BS0001A1||
读取和替换CSV文件的代码如下:
var contents = File.ReadAllText(filePath).Split(new string[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries).ToArray();
var formattedContents = contents.Select(line => line.Replace(',', '|'));

1
不要使用字符串操作。将CSV解析为单独的数据字段,然后从头开始构建一个新的CSV。 - undefined
如果你真的想使用字符串操作,可以参考这个答案中发布的正则表达式。 - undefined
1
双引号字段中可以包含双引号吗?如果不行,那么按照Marc B的建议来做会比较容易。如果可以,那么做起来可能稍微麻烦一些,但你仍然应该去做。 - undefined
1个回答

3

对于其他遇到困难的人,我最终使用了内置的 .net csv 解析器。详情和示例请参见此处:http://coding.abel.nu/2012/06/built-in-net-csv-parser/

我的具体代码:

 // Create new parser object and setup parameters
var parser = new TextFieldParser(new StringReader(File.ReadAllText(filePath)))
{
    HasFieldsEnclosedInQuotes = true,
    Delimiters = new string[] { "," },
    TrimWhiteSpace = true
};

var csvSplitList = new List<string>();

// Reads all fields on the current line of the CSV file and returns as a string array
// Joins each field together with new delimiter "|"
while (!parser.EndOfData)
{
    csvSplitList.Add(String.Join("|", parser.ReadFields()));
}

// Newline characters added to each line and flattens List<string> into single string
var formattedCsvToSave = String.Join(Environment.NewLine, csvSplitList.Select(x => x));

// Write single string to file
File.WriteAllText(filePathFormatted, formattedCsvToSave);
parser.Close();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接