如何检测用户的区域设置以获取正确的csv分隔符?

Jon*_*age 6 .net culture locale c++-cli

我有一个简单的数据转换工具,它可以产生的一个输出是一个csv文件.

这在英国完美无缺,但当我把它运到德国客户时,我遇到了一些问题.特别地,它们使用' ,'来表示浮点数中的小数点,反之亦然.这意味着当他们在excel中打开他们的数据文件时,至少可以说结果相当混乱:-)

替换正确的字符是微不足道的,但我如何检测是否应用此字符?

编辑:

所以这:

a,b,c
1.1,1.2,1.3
"1.1",1,2,"1,3"
"this,is,multi-
-line",this should be column 2, row 4
a;b;c
"a;b","c"
Run Code Online (Sandbox Code Playgroud)

..在加入英国的Excel时看起来像这样:

+----------------+-----+-----+-----+
| a              | b   | c   |     |
+----------------+-----+-----+-----+
| 1.1            | 1.2 | 1.3 |     |
+----------------+-----+-----+-----+
| 1.1            | 1   | 2   | 1,3 |
+----------------+-----+-----+-----+
| this,is,multi- |     |     |     |
| -line          | 2   | 4   |     |
+----------------+-----+-----+-----+
| a;b;c          |     |     |     |
+----------------+-----+-----+-----+
| a;b            | c   |     |     |
+----------------+-----+-----+-----+
Run Code Online (Sandbox Code Playgroud)

..但德国会发生什么?

Ahm*_*mad 13

使用:

System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator
Run Code Online (Sandbox Code Playgroud)

写入CSV:"列表分隔符"字符串应该用作CSV中的分隔符(请参阅下面有关如何更改此变量的信息).保存为CSV时,更改"列表分隔符"的值也会反映在Excel中.

读取CSV:确定CSV中的分隔符是另一个故事,它有点复杂.原则上,可以在一个系统中使用","作为CSV分隔符并使用";" 或者甚至是"*"或任何("字符串")作为另一个系统上的分隔符:本文提供了一些有关如何检测读取跨系统CSV文件的CSV分隔符的见解:

http://www.codeproject.com/Articles/231582/Auto-detect-CSV-separator.

您还可以通过更改Windows中的"列表分隔符"值对导出程序执行某些测试(每个Windows操作系统可能不同):

  • 打开区域和语言对话框.
  • 在"格式"选项卡上选择.
  • 点击"其他设置"
  • 编辑"列表分隔符"的值


小智 8

正如其他人所提到的,CSV通常应该以逗号分隔,并且字段应该是双引号.但是,还有MS Excel特定的行为导致错误地导入正确的CSV文件.这是因为MS Excel默认使用Windows系统中的"区域和语言选项"中设置的列表分隔符.对于美国/英国语言环境,它是逗号,但对于像德语这样的语言,它是分号.因此对于MS Excel,选项是每个区域设置使用不同的分隔符.


Dar*_*rov 6

CurrencyDecimalSeparator属性包含特定的文化小数点分隔符.这就是说CSV分隔符不依赖于文化.它是您向解析器指示的CSV文件的属性.谈论解析器我真诚地希望你不要使用自己的CSV解析器.


Joh*_*mer -5

顾名思义,CSV 文件应该以逗号分隔,并且不依赖于本地。但是,为了避免此问题,您可以采取的措施是用双引号引用 CSV 文件中的相关十进制数字,如下所示:"10,20", "1,50", "This is another column". 对于任何像样的 CSV 解析器(例如FileHelpers库)来说,这应该完全避免该问题,该解析器会将其读取为10,201,50而不是:1020150

请参阅CSV

更复杂的 CSV 实现允许在字段值中使用逗号和其他特殊字符。许多实现在包含保留字符(例如逗号、双引号或换行符)的值周围使用 "(双引号)字符;嵌入的双引号字符可以由一对连续的双引号表示

  • 好吧,那很好,您见过微软在英语以外的环境中表现出色吗?例如。捷克语言环境?(默认以“;”分隔) (4认同)
  • “应该以逗号分隔,并且不依赖于本地...” – 您应该告诉 Microsoft!Excel 使用区域和语言设置中定义的“列表分隔符”字符。 (3认同)
  • 正如 druciferre 所说,微软使用区域性配置导出 CSV。因此分隔符并不总是“;”。 (2认同)