6

在德语中,十进制分隔符是 ,值分隔符是“;” . 在英语/其他语言中,小数分隔符是 . 和值分隔符是“,”。

我想创建一个独立于当前文化的 .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(",");
            }
        }
    }
}

此代码的问题在于操作系统是否为德语。小数点分隔符显示为“,”而不是“.”。

请让我知道代码缺少某些内容。

4

3 回答 3

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”代表美利坚合众国。

希望这可以帮助!

于 2013-08-10T23:05:01.470 回答
2

解决德国文化问题的一个快速解决方案是将这些双值嵌入引号。结果:

English: "10.5","20.3","30.2"
German: "10,5","20,3","30,2"

http://en.wikipedia.org/wiki/Comma-separated_values

于 2012-06-29T11:39:03.393 回答
1

这个问题没有简单的解决方案:CSV不是文件格式定义(尽管有 RFC 4180)。

例如,Excel 使用用户设置的本地化列表分隔符和本地化数据格式读取和保存 csv。这样,CSV 中的“逗号”并不意味着逗号,而是通用列表分隔符(对于许多欧盟国家来说,这是分号,正如 Tim Schmelter 所说)。

如果值用引号引起来,它们通常被视为字符串。Excel 无论如何都会尝试解析 CSV 行的引用元素,因此这似乎在非常特殊的情况下有效。

问题是 CSV 文件的写入者和读取者都应该使用相同的文化,否则几乎所有不是字符串的东西都会出现问题(数字是一个,日期/时间是另一个问题来源)。

我对日期使用经验派生的解决方案,由格式 string 组成yyyy/MM/dd HH:mm:ss。我观察到它允许在 Excel 和我的程序之间交换工作日期,可以用英语或意大利语互换。

我仍然没有找到十进制数的通用解决方案。我怀疑科学记数法可能会,但还没有时间测试。

于 2013-03-11T13:07:12.137 回答