CSV是“Comma Separated Values”的简写,但CSV文件一定是逗号分隔的吗?其实并不一定。
实验
让我们用一个实验说明这个问题。首先,将系统的区域设置设置为中文(中国),在Excel中创建如下的工作表
key | value |
a | 1.5 |
b | 2.5 |
c | 3.5 |
然后另存为CSV文件,用记事本打开可以看到内容如下。这是一个很平常的CSV文件。
key,value
a,1.5
b,2.5
c,3.5
将工作簿保存为xlsx格式,然后将系统的区域设置改为德语(德国),再次打开工作簿并另存为CSV文件。通过记事本打开可以发现,CSV文件的内容已经变成了下面这样。值的分隔符不再是逗号,而变成了分号。
key;value
a;1,5
b;2,5
c;3,5
将区域设置改为中文(中国)之后,用Excel打开上面这个在德语区域设置下保存的CSV文件,发现内容变成了下面这样的错乱状态。Excel读取CSV文件时使用了逗号作为分隔符,但这个文件中的逗号实际上表示的是小数点。
key;value | |
a;1 | 5 |
b;2 | 5 |
c;3 | 5 |
总结
至少对于Excel而言,CSV文件并不是一成不变的固定格式,而是会使用区域设置中的“列表分隔符”作为分隔符号。当编程写入或解析CSV的时候应当要考虑本地化的问题。
在Windows的“设置-时间和语言-区域-其他日期、时间和区域设置”页面中,点击“更改日期、时间或数字格式”,在“其他设置-数字-列表分隔符”处即可看到CSV文件中用于分隔的字符。
在.NET中,使用API CultureInfo.CurrentCulture.TextInfo.ListSeparator
可以获得当前区域设置的“列表分隔符”。.NET的CSV库CsvHelper强制要求调用者传入一个CultureInfo
对象来指定用于处理CSV文件的区域设置。
留言
有想法?请给我们留言!您的留言不会直接显示在网站内。