【问题标题】:Reading from CSV with value numbers formatted从 CSV 读取值数字格式
【发布时间】:2019-03-05 12:45:58
【问题描述】:

我从 CSV 文件中读取并自动创建不同格式的新 CSV 文件的过程。

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

第 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(',');
                }
            }

【问题讨论】:

  • 你可以尝试一些正则表达式来检查 , 不在两个数字之间。但这也可能不起作用,具体取决于其中的数据。

标签: c# csv split streamreader


【解决方案1】:

你不能。当 CSV 文件包含数字(或任何带有 , 的文本)时,它需要引用字段。简单的代码(即不是人工智能)不可能像人眼那样区分。

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

应该是:

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

常见的 CSV 解析器/库会知道如何处理这个问题(例如 CsvHelper

如果您可以控制 CSV 文件的生成,那么您应该进行此更改。如果它来自第 3 方,那么看看你是否可以让他们做出改变。

如果在字段之后总是有空格而不是在数字字段中,则在您的示例中可能存在边缘情况。然后,您的分隔符变为“,”,而不仅仅是“,”

【讨论】:

    【解决方案2】:

    旁注:

    您应该考虑不要在 .csv 文件中使用特定于区域性的分隔符,因为当使用不同的区域设置导出/导入数据时,它总是会导致令人头疼的问题。

    可能的解决方案:

    • 我建议使用不变的文化转储和解析数字(日期等):

      myNumber.ToString(CultureInfo.InvariantCulture)

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

    Excel 与 .csv 格式

    Excel 的另一个附注:Microsoft 的 .csv 处理有些令人困惑,并且与 RFC Standard 相矛盾。当您在 Excel 中导出 .csv 时,始终使用区域设置转储数字。为避免与分隔符混淆,如果小数点分隔符为逗号,Excel 将使用不同的字符(通常是分号)作为分隔符。

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

    我发现微软的这个解决方案很不幸,因为不同区域设置转储的 .csv 文件不能总是在另一台计算机上读取,这只会导致几十年来的麻烦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 2012-01-26
      • 1970-01-01
      相关资源
      最近更新 更多