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

时间:2011-11-11 10:34:38

标签: .net c++-cli locale culture

我有一个简单的数据转换工具,它可以生成的输出之一是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"

..在英国加载到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   |     |     |
+----------------+-----+-----+-----+

..但德国会发生什么?

6 个答案:

答案 0 :(得分:12)

使用:

System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator

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

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

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

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

  • 打开区域和语言对话框。
  • 在“格式”标签上选择。
  • 点击“其他设置”
  • 编辑“列表分隔符”的值

答案 1 :(得分:8)

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

答案 2 :(得分:6)

CurrencyDecimalSeparator属性包含给定区域性的小数分隔符。这就是说CSV分隔符不依赖于文化。它是您向解析器指示的CSV文件的属性。谈论解析器我真诚地希望你是not rolling your own CSV parser

答案 3 :(得分:0)

正如其他人所推荐的那样,格式不应该是区域设置敏感的。 这适用于存储(CSV或其他格式的文件)或通信协议。您应该只担心表示层的区域设置灵敏度。 否则,这意味着美国用户保存的文件(例如)不能由德国用户加载(反之亦然)。

请点击此处查看更完整的指南:http://mihai-nita.net/2005/10/25/data-internationalization/

答案 4 :(得分:0)

我阅读此问题的方式是问题不在于.csv文件。 .csv文件的格式可能对所有用户都是相同的,就像上面每个答案中重复的那样。

但是,Excel VBA应用程序对语言环境敏感。

当不同国家的不同用户打开Excel时,他们将使用现有的区域设置(有时与.csv文件不同)使用Excel,因此,将以不同的方式解释.csv文件中的数据。

问题是,我们如何围绕它编程,以便我们的代码提取当前的区域分隔符,然后执行正确的解释?

一种方法是制作一个小的代码片段,将一个十进制数字写入测试单元,然后读回以查看使用了什么十进制,但是应该有一种更简洁的方法...

答案 5 :(得分:-1)

名称建议的CSV文件应以逗号分隔,并且不依赖于本地。但是,为避免此问题,您可以做的是双引号CSV文件中的相关十进制数字:"10,20", "1,50", "This is another column"。这应该完全避免任何体面的CSV解析器(例如FileHelpers库)的问题,这将解释为10,201,50而不是:10,{ {1}},201

请参阅CSV

  

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