6

ドイツ語では、10進数の区切り文字は、であり、値の区切り記号は「;」です。。英語/その他の言語では、10進数の区切り文字はです。値の区切り文字は「、」です。

現在のカルチャに依存しない.csvファイルを作成したいと思います。つまり、.csvファイルには常に「。」が必要です。10進数の区切り文字があり、「、」には値の区切り記号があります。

このためのコードを以下に示します。

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(",");
            }
        }
    }
}

このコードの問題は、OSがドイツ語であるかどうかです。10進数の区切り文字は、「。」ではなく「、」で表示されます。

コードに何かが欠けていることを教えてください。

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 が言ったように、多くの EU 諸国では、これはセミコロンです)。

値が引用符で囲まれている場合、通常は文字列として扱われます。とにかく、Excel は CSV 行の引用符で囲まれた要素を解析しようとするため、これは非常に特殊なケースで機能するように見える場合があります。

問題は、CSV ファイルのライターとリーダーの両方が同じカルチャを使用する必要があることです。そうしないと、文字列以外のほとんどすべてで問題が発生します (数字は 1 つ、日付/時刻は別の問題の原因です)。

フォーマット文字列で構成される、経験的に導き出された日付のソリューションを使用しますyyyy/MM/dd HH:mm:ss。Excel と私のプログラムの間で、英語またはイタリア語で作業日を交換できることがわかりました。

私はまだ10進数の普遍的な解決策を見つけていません. 科学的記数法でよいのではないかと思いますが、テストする時間がありませんでした。

于 2013-03-11T13:07:12.137 に答える