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

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

狗,猫,100,100,鱼

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

谢谢

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

相反,使用专用的解析器,如Microsoft.VisualBasic.TextFieldParser,CodeProject的FastCSV或Linq2csv ,或者我自己在Stack Overflow上的实现 。

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

Dog,Cat,"100,100",Fish 

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

我会认为您的文件是一个错误的情况 – 并试图在生成端纠正问题。

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

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

 100,100,100 

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

你可能想看看免费的开源项目FileHelpers 。 如果您必须使用自己的代码, 这里是CSV“标准”格式的入门读物

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

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

不要只拆分,分开“,”。
更好的是,使用谷歌或codeplex等CSV库
在.NET中读取CSV文件?

您可以使用Regex.Replace在解析之前根据下面的具体删除第三个逗号?

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

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

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

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

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

你知道它总是包含四列吗? 如果是这样,这个快速而简单的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(); 

不优雅,但它的工作原理。