在德语langauage-十进制分隔符中,值分隔符为“;” 。在英语/其他语言中,十进制分隔符是。和值分隔符是“,”。
我想创建一个独立于当前文化的.csv文件。我的意思是.csv文件总是应该有“。”有小数分隔符和“,”有值分隔符。
下面给出的代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Globalization;
namespace CSV_FILE_FORMAT
{
class Program
{
static void Main(string[] args)
{
string aFileName = "result.csv";
FileStream aFileStream = new FileStream(aFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
StreamWriter m_StreamWriter = new StreamWriter(aFileStream);
double[] values = new double[] { 10.5, 20.3, 30.2 };
for(int i = 0; i < values.Length;i++)
{
m_StreamWriter.Write(values[i].ToString(CultureInfo.InvariantCulture));
m_StreamWriter.Write(",");
}
}
}
}
此代码的问题在于操作系统是德语版。小数分隔符显示为“,”而不是“。”。
请告诉我代码遗失的内容。
答案 0 :(得分:6)
您可以从当前文化中获取小数分隔符和列表分隔符。
CultureInfo culture = new CultureInfo(currentCultureName);
string decimalSeparator = culture.NumberFormat.NumberDecimalSeparator;
string listSeparator = culture.TextInfo.ListSeparator;
并且,如果正在写入的值包含任何分隔符,则将该值括在双引号内。
string val = values[i].ToString(CultureInfo.InvariantCulture);
if(val.Contains(decimalSeparator) || val.Contains(listSeparator))
{
val = string.Format("\"{0}\"", val);
}
m_StreamWriter.Write(val);
m_StreamWriter.Write(listSeparator);
目前的文化名称可能是这样的:美国的“en-US”。
希望这有帮助!
答案 1 :(得分:2)
快速解决方案,以解决德国文化问题是将这些双重值嵌入引号。结果:
English: "10.5","20.3","30.2"
German: "10,5","20,3","30,2"
答案 2 :(得分:1)
此问题没有简单的解决方案:CSV 不文件格式定义(尽管是RFC 4180)。
Excel,例如,使用本地列表分隔符和用户设置的本地化数据格式读取和保存csv。这样,CSV中的“逗号”并不意味着逗号,而是通用列表分隔符(对于许多欧盟国家,这是分号,如Tim Schmelter所说)。
如果值用引号括起来,则通常将它们视为字符串。 Excel尝试解析CSV行的引用元素,因此这似乎适用于非常特殊的情况。
问题在于CSV文件的编写者和读者都应该使用相同的文化,否则几乎所有不是字符串的问题都会出现问题(数字是一,日期/时间是问题的另一个来源)。
我使用经验派生的日期解决方案,包含格式字符串yyyy/MM/dd HH:mm:ss
。我发现它允许Excel和我的程序之间的工作日期交换,可以用英语或意大利语互换。
我还没有找到十进制数的通用解决方案。我怀疑科学记谱法可能会做,但没有时间进行测试。