使用C#解析CSV文件,忽略千位分隔符

时间:2011-04-04 16:33:47

标签: c# csv

处理一个带有CSV文件并在每个“,”上拆分的程序。我遇到的问题是有些数字中有千个分隔符。在CSV文件中,数字正确呈现。当作为文本文档查看时,它们显示如下:

狗,猫,100100,鱼

在CSV文件中,有四个单元格,其值为“Dog”,“Cat”,“100,000”,“Fish”。当我把“,”分成一个字符串数组时,它包含5个元素,当我想要的是4.有人知道解决这个问题的方法吗?

由于

8 个答案:

答案 0 :(得分:6)

在读取csv代码时会出现两个常见错误:使用split()函数并使用正则表达式。这两种方法都是错误的,因为它们容易出现像你这样的极端情况并且比它们更慢。

相反,在Stack Overflow上使用专用解析器,如Microsoft.VisualBasic.TextFieldParser,CodeProject的FastCSVLinq2csvmy own implemention

答案 1 :(得分:3)

通常,CSV文件会将这些元素包装在引号中,从而使您的行显示为:

Dog,Cat,"100,100",Fish

这将正确解析(如果使用合理的方法,即:TextFieldParser class或第三方库),并避免此问题。

我会将您的文件视为错误案例 - 并尝试在生成方面纠正此问题。

话虽如此,如果不可能,您需要在文件中获得有关数据结构的更多信息以更正此问题。例如,在这种情况下,你知道你应该有4个元素 - 如果你找到5个元素,你可能需要将第3个和第4个元素合并在一起,因为这两个元素代表了行中唯一的数字。

但是在一般情况下这是不可能的 - 例如,请采取以下措施:

100,100,100

如果是2个数字,那么它应该是100100, 100还是100, 100100?如果没有更多信息,就无法确定这一点。

答案 2 :(得分:1)

您可能想要查看免费的开源项目FileHelpers。如果您必须使用自己的代码,here是CSV“标准”格式

的入门读物

答案 3 :(得分:0)

你可以随时拆分(“\”,\“”),然后修剪第一个和最后一个元素。

但是我会研究与“。”匹配元素的正则表达式。

答案 4 :(得分:0)

不要只拆分,拆分“,”。
更好的是,使用google或codeplex等的CSV库 Reading a CSV file in .NET?

答案 5 :(得分:0)

你可以在解析之前使用Regex.Replace特定地删除第三个逗号吗?

从输入字符串中指定的字符位置开始,用替换字符串替换Regex构造函数中指定的模式的指定出现次数。在每次匹配时调用MatchEvaluator委托来评估替换。

[C#] public string Replace(string, MatchEvaluator, int, int);

答案 6 :(得分:0)

我遇到类似的问题,其中包含换行字段。我不相信这是优雅的,但是......对于我的我基本上把我切成了线条,然后如果该行没有以文本分隔符开头,我附加了它到上面的那一行。

你可以尝试这样的事情:逐步通过每个字段,如果字段有一个结束文本分隔符,移动到下一个,如果没有,抓住下一个字段,appaend it,rince并重复直到你有一个结束分隔符(允许1,000,000,000等)..

(我咖啡因被剥夺了,饥肠辘辘,我确实写了一些代码,但它太丑了,我甚至没有贴出来)

答案 7 :(得分:0)

你知道它总是包含四列吗?如果是这样,这个快速而又脏的LINQ代码将起作用:

string[] elements = line.Split(',');

string element1 = elements.ElementAt(0);
string element2 = elements.ElementAt(1);

// Exclude the first two elements and the last element.
var element3parts = elements.Skip(2).Take(elements.Count() - 3);
int element3 = Convert.ToInt32(string.Join("",element3parts));

string element4 = elements.Last();

不优雅,但有效。