我有一个简单的数据转换工具,它可以生成的输出之一是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 | | |
+----------------+-----+-----+-----+
..但德国会发生什么?
答案 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,20
和1,50
而不是:10
,{ {1}},20
和1
。
请参阅CSV:
更复杂的CSV实现允许使用逗号和其他特殊功能 字段值中的字符。许多实现使用" (双引号) 包含保留字符的值周围的字符(例如 逗号,双引号或换行符);嵌入式双引号字符 可以用一对连续的双引号来表示