编写.csv文件 - 独立于文化

Rag*_*v55 6 c#

在德语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(",");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

请让我知道代码遗漏了什么.

Vij*_*jay 6

您可以从当前文化中获取小数分隔符和列表分隔符.

CultureInfo culture = new CultureInfo(currentCultureName);
string decimalSeparator = culture.NumberFormat.NumberDecimalSeparator;
string listSeparator = culture.TextInfo.ListSeparator;
Run Code Online (Sandbox Code Playgroud)

并且,如果正在写入的值包含任何分隔符,则将该值括在双引号内.

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);
Run Code Online (Sandbox Code Playgroud)

目前的文化名称可能是这样的:美国的"en-US".

希望这可以帮助!


小智 2

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

English: "10.5","20.3","30.2"
German: "10,5","20,3","30,2"
Run Code Online (Sandbox Code Playgroud)

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

  • 不过,德语 Excel 版本要求使用“;”作为分隔符。 (3认同)