令人不快的意外之后,逗号分隔值(CSV)文件不一定以逗号分隔,我试图找出是否有任何方法可以检测客户端计算机上的区域设置列表分隔符值是什么http请求。
场景如下:用户可以从网站下载CSV格式的一些数据(RoR,如果重要的话)。该CSV文件是即时生成的,发送给用户,并且大部分时间双击并在目的地的Windows机器上的MS Excel中打开。现在,如果用户将','设置为列表分隔符,则数据将按列正确排列,但如果设置了任何其他分隔符(此处广泛使用';'),则只会将其放入单个列中。那么,有没有办法检测客户端计算机上使用的分隔符,并相应地生成文件?
我有一种沉闷的感觉,但事实并非如此,但在向顾客传递“无法做到,对不起”之前我想确定:)
答案 0 :(得分:7)
这是我刚刚根据here显示的方法编写的JavaScript解决方案:
function getListSeparator() {
var list = ['a', 'b'], str;
if (list.toLocaleString) {
str = list.toLocaleString();
if (str.indexOf(';') > 0 && str.indexOf(',') == -1) {
return ';';
}
}
return ',';
}
密钥位于使用系统列表分隔符的toLocaleString()方法中。
您可以使用JavaScript获取列表分隔符并将其设置在cookie中,然后您可以从服务器中检测到该值。
我检查了所有Windows区域设置,看起来默认列表分隔符实际上总是“,”或“;”。对于某些语言环境,“控制面板”中的下拉列表提供了两种选项;对于其他人,它只提供','。一个区域设置,Divehi,有一个奇怪的字符,我之前没有看到它作为列表分隔符,并且,对于任何区域设置,用户可以输入他们想要的任何字符串作为列表分隔符。
将随机字符串作为分隔符放在CSV文件中对我来说听起来很麻烦,所以我上面的函数只返回';'或'。',它只会返回';'如果它在Array.toLocaleString字符串中找不到','。我不完全确定array.toLocaleString是否具有跨浏览器保证的格式,因此indexOf检查而不是选择特定索引处的字符。
使用Array.toLocaleString来获取列表分隔符适用于IE6,IE7和IE8,但不幸的是它似乎不适用于Firefox,Safari,Opera和Chrome(或至少我的浏览器版本)计算机):无论Windows“列表分隔符”设置如何,它们似乎都用逗号分隔数组项。
另外值得注意的是,默认情况下Excel在解析CSV文件中的数字时似乎使用系统“小数分隔符”。育。因此,如果您正在本地化列表分隔符,则可能还需要本地化小数分隔符。
答案 1 :(得分:1)
我认为每个人都应该使用OpenOffice中的Calc - 它会在您打开有关编码,列分隔符等文件时询问。我不知道你的问题的答案,但也许你可以尝试在html表或xml中发送数据 - excel应该正确读取它们。根据我的经验,将数据导出到excel并不容易。几周前我遇到了问题,经过几个小时的工作后,我问了一个无法打开excel的csv文件的人。这是Excel 98 ......
查看html example和xml。
答案 2 :(得分:0)
您是否可以让具有非逗号分隔符的用户设置配置文件类型的选项,然后根据用户设置生成CSV,默认为逗号?
答案 3 :(得分:0)
汤姆斯,据我所知,没有办法实现你所追求的目标。您可以做的最多的事情是尝试检测用户区域设置并将其映射到locales / list分隔符的数据库,从而改变.CSV文件中的列表分隔符。
答案 4 :(得分:0)
getListSeparator函数的简化版本,允许任何字符成为分隔符:
function getListSeparator_bis()
{
var list = ['a', 'b'];
return(list.toLocaleString().charAt(1));
}// getListSeparator_bis
只需在操作系统中将任何字符(f.e。'#')设置为列表分隔符,然后尝试上述代码。返回适当的char(即'#',如果设置为sugested)。