检测CSV分隔符是“;”还是“,”。

6

根据不同的区域设置,CSV分隔符(或列表分隔符)可能是;而不是,,在Windows上至少取决于区域设置。

有没有一种跨平台的方法来检测Qt中的CSV分隔符?

如果没有跨平台的方法,则是否有Windows特定的方法?


例如在芬兰,逗号(,)被用作小数分隔符。这就是为什么需要另一个字符(;)作为千位分隔符的原因。 - user362638
@Roku 是的,我明白了。只是在这种情况下,我认为 CSV 应该被称为 SSV :) - Ivaylo Strandjev
在保加利亚,列表分隔符也是 ; - sashoalm
1
@Roku:这就是为什么有引号的原因:X,"1,200",950。可悲的是,没有人遵循RFC 4180。 - Joker_vD
1
RFC 4180 的问题在于它是事后创建的。实际上,CSV 文件并没有标准。 - sashoalm
1
@Joker_vD,你说得没错,但不要忘记通常的主要问题是使你的应用程序与现有系统兼容。例如,在MS Excel中,如果你传递分隔符,它不会将列中的字符串进行分割。 - Lol4t0
3个回答

2

有一个QLocale::groupSeparator()函数:

QChar separator = QLocale().groupSeparator();

编辑:

但这不是正确的答案。组分隔符是在长数字之间使用的字符,例如:“1,234.56”。在这个例子中,组分隔符是逗号,小数点分隔符是句号。

似乎QLocale根本没有包含列表分隔符。您可以根据使用的小数分隔符来猜测。如果小数分隔符为,则使用,作为CSV分隔符;如果小数分隔符为,,则使用;作为CSV分隔符。但我不知道这是否涵盖了所有语言。


有趣。这有什么用途? - Phlucious
1
不,那是错误的。它打印出 ' ',这肯定不是 CSV 分隔符:qDebug() << QLocale(QLocale::Russian, QLocale::RussianFederation).groupSeparator();。看起来 groupSeparator 是数字组中的分隔符。 - Lol4t0
@Roku 谢谢,我还没有来得及测试它,因为它看起来非常可信,所以我立即假定它是正确的并接受了它。不过没关系,你修改后的答案仍然是正确的 :) - sashoalm

1

对于 Windows 系统,您可以使用 GetLocaleInfo API 读取列表分隔符。

GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLIST, szBuf, sizeof(szBuf));

1
在Qt 5.15中,有一个函数QLocale::createSeparatedList可以用来创建一个分隔的列表或者检测分隔符(通过创建一个虚拟列表并检测使用了什么分隔符)。
示例(来自下面的评论):
QLocale l; 
qDebug() << l.createSeparatedList({"1","2","3"}).at(1);

检测分隔符(通过创建一个虚拟列表并检测使用了哪个分隔符),我喜欢这个想法,如果您能提供一个代码示例来准确说明如何做到这一点,那会让您的答案更加出色。也许可以这样写:QLocale l; qDebug()<<l.createSeparatedList({"1","2","3"}).at(1); - Abderrahmene Rayene Mihoub
好主意,但对我来说不起作用。在我的区域设置(意大利,意大利)中,这会打印一个逗号,但在我的区域设置(在Windows 10上:设置->时间和语言->区域->其他日期、时间和区域设置->区域->其他设置)中,“列表分隔符”是一个分号。这确实是Excel默认识别的.csv文件的分隔符。我还尝试了locale.groupSeparator(),但它给我一个点。恐怕没有办法使用Qt库获取CSV分隔符!:-( - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接