CSV文件的地区差异和本地化

CSV是“Comma Separated Values”的简写,但CSV文件一定是逗号分隔的吗?其实并不一定。

实验

让我们用一个实验说明这个问题。首先,将系统的区域设置设置为中文(中国),在Excel中创建如下的工作表

keyvalue
a1.5
b2.5
c3.5
Excel中输入的原始表格

然后另存为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;15
b;25
c;35
Excel解析的不同区域的CSV文件

总结

至少对于Excel而言,CSV文件并不是一成不变的固定格式,而是会使用区域设置中的“列表分隔符”作为分隔符号。当编程写入或解析CSV的时候应当要考虑本地化的问题。

在Windows的“设置-时间和语言-区域-其他日期、时间和区域设置”页面中,点击“更改日期、时间或数字格式”,在“其他设置-数字-列表分隔符”处即可看到CSV文件中用于分隔的字符。

在.NET中,使用API CultureInfo.CurrentCulture.TextInfo.ListSeparator可以获得当前区域设置的“列表分隔符”。.NET的CSV库CsvHelper强制要求调用者传入一个CultureInfo对象来指定用于处理CSV文件的区域设置。