【发布时间】:2023-03-27 04:26:01
【问题描述】:
我想从 CSV 文件导入数据,但有些单元格在字符串值中包含逗号。如何识别哪个逗号用于分隔,哪个在单元格内容中?
【问题讨论】:
我想从 CSV 文件导入数据,但有些单元格在字符串值中包含逗号。如何识别哪个逗号用于分隔,哪个在单元格内容中?
【问题讨论】:
使用 TextFieldParser :usage
using Microsoft.VisualBasic.FileIO; //Microsoft.VisualBasic.dll
...
using(var csvReader = new TextFieldParser(reader)){
csvReader.SetDelimiters(new string[] {","});
csvReader.HasFieldsEnclosedInQuotes = true;
fields = csvReader.ReadFields();
}
【讨论】:
一般来说,不要费心自己编写导入。
我对 FileHelpers 库有很好的体验。 http://www.filehelpers.com/
确实,我希望您的字段被引用。 Filehelpers 开箱即用地支持这一点。
否则你无能为力。
【讨论】:
除非你在字符串周围有引号,否则你会非常紧张,因此使用“引号和逗号”分隔符样式。如果您可以控制导出工具,则必须选择“将字符串括起来引号”或将分隔符更改为波浪号或克拉符号之类的东西。
如果不好,则必须编写一些代码。如果您检测到“a..z”,则开始计算逗号,然后继续处理字符串,直到检测到 [0..9],即使这样,这也会有问题,因为人们可以将 [0..9] 放在他们的文本。 最好,这将是一个尽力而为的过程。你必须知道什么时候你在字符中,什么时候你不会在字符中。我怀疑即使是正则表达式也会在这方面对你有很大帮助。
我唯一能想到的另一件事是遍历数据并查找逗号。然后看逗号前后。如果您被字符包围,则将逗号替换为备用字符,例如克拉“^”符号或波浪号“~”。然后正常处理文件,然后返回并用逗号替换备用字符。
祝你好运。
【讨论】:
使用 FileHelper 是明确的方式。他们在为您构建所有逻辑方面做得很好。我遇到了同样的问题,我必须解析一个包含逗号作为字段一部分的 CSV 文件。这个实用程序做得很好。您所要做的就是在字段上使用填充属性
[FieldQuoted('"', QuoteMode.OptionalForBoth)]
详情http://www.filehelpers.com/forums/viewtopic.php?f=12&t=391
【讨论】:
我们也可以像下面这样使用 RegEx。
Regex CSVParser = new Regex(",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))");
String[] Fields = CSVParser.Split(Test);
【讨论】: