从CSV读取值格式已格式化的数值

时间:2019-03-05 12:45:59

标签: c# csv split streamreader

我希望从CSV文件中读取该文件并希望系统自动创建一个格式不同的新CSV文件的过程。

我能够读取和格式化CSV文件,但是在处理数字格式时遇到了问题,因为值以千(1,000)格式格式化。例如,当我从CSV中读取并用'分隔每一行时,我的值就会更改。

Ex Line 1:测试名称,测试描述,测试货币,12,500

var line1 = line.split(',');

由于定界符,这会将值12和500分开。请问如何获取全部数字?

  using (var reader = new StreamReader(openFileDialog1.FileName))
            {
                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine();
                    var values = line.Split(',');
                }
            }

2 个答案:

答案 0 :(得分:3)

你不能。当CSV文件包含数字(或其中带有的任何文本)时,需要用引号将字段引起来。简单的代码(即非AI)无法以您的肉眼区分。

  

Ex Line 1:测试名称,测试描述,测试货币,12,500

应该是:

  

第1行:“测试名称”,“测试描述”,“测试货币”,“ 12,500”

通用CSV解析器/库将知道如何处理(例如CsvHelper

如果您可以控制CSV文件的生成,则应进行此更改。如果来自第三方,请查看是否可以让他们进行更改。

在示例中,如果在字段之后始终有一个空格,而在数字字段中没有空格,则可能会出现边缘情况。然后,您的定界符将变为“,”,而不仅仅是“,”

答案 1 :(得分:0)

旁注:

您应该考虑不要在.csv文件中使用特定于文化的分隔符,因为当使用不同的区域设置导出/导入数据时,它总是会引起麻烦。

可能的解决方案:

  • 我建议转储并解析具有不变文化的数字(日期等):

    myNumber.ToString(CultureInfo.InvariantCulture)

  • 如果确实需要转储带有逗号十进制符号的数字,请将该字段括在引号中。这不会转换数字字符串,因为.csv没有类型信息。

Excel与.csv格式

Excel的另一条注释:Microsoft的.csv处理有些混乱,与RFC Standard相矛盾。在Excel中导出.csv时,数字始终会使用区域设置进行转储。为了避免与分隔符混淆,如果小数点分隔符为逗号,Excel将使用另一个字符(通常为分号)作为分隔符。

使用的分隔符是在操作系统的区域设置中设置为列表分隔符的分隔符,并且可以通过CultureInfo.TextInfo.ListSeparator属性检索.NET中的分隔符。

我发现Microsoft的这种解决方案非常不幸,因为由不同的区域设置转储的.csv文件不能始终在另一台计算机上读取,这只会造成数十年来的麻烦。