2012-06-29 9 views
6

ドイツ語でlangauage-decimal seperatorsはあり、値分離子は ";"です。 。英語/その他の言語では、小数点の区切り文字は次のとおりです。セパレータの値は「、」です。.csvファイルを作成する - カルチャとは無関係

現在のカルチャとは別に.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(","); 
      } 
     } 
    } 
} 

OSがドイツ語の場合は、このコードの問題があります。小数点の区切り文字は "。"の代わりに "、"と表示されます。

コードが不足していることを教えてください。

+2

_ "OSがドイツ語の場合は問題です。小数点の区切り文字は、"。 "の代わりに"、 "と表示されます。_これは、' CultureInfo.InvariantCulture'を使用して防止する必要があります。だから私はまだ見過ごされているはずです。 –

+0

m_StreamWriter.Write(values [i] .ToString(CultureInfo。InvariantCulture));私はculture.invariantcultureを使用しています。それでも私は適切な価値を得ることができません。 – Raghav55

+1

提供されたコードは、ドイツ語OS(Windows 7)で正常に動作します(リソースを閉じることを除いて;-))、ダブルスはポイント "。"で整形されます。コメントによって期待通りに。文化の設定が "、"に設定されていても。 –

答えて

2

ドイツの文化問題を解決する迅速な解決策は、これらの二重の値を引用符で埋め込むことです。結果:CSVは、(RFC 4180にもかかわらず)、ファイルフォーマット定義ではありません。

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

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

+0

IMHO、これはCSVパーサーとのより良い解決策になります – Indy9000

+2

ドイツのExcel版では、区切り記号として ';'が使用されることが期待されています。 – Joey

+0

それは読者の部分に非常に依存します:ドイツ語または不変。 –

1

この問題に対する簡単な解決策はありません。

例として、Excelは、ユーザーが設定したローカライズされたリスト区切りおよびローカライズされたデータ形式を使用してcsvを読み取り、保存します。このように、CSVの「Comma」はカンマを意味するのではなく、ジェネリックリストセパレータ(多くのEU諸国では、これはセミコロンであるとTim Schmelterが述べたとおりです)。

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

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

書式文字列yyyy/MM/dd HH:mm:ssからなる、日付のための経験的に派生した解を使用します。私は、Excelと私のプログラムとの交換日を英語またはイタリア語で交換可能にすることを認めました。

私はまだ10進数の普遍的な解を見つけていません。私はScientific表記法がそうするかもしれないと思うが、テストする時間がなかった。

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」のようになります。

希望すると便利です。

関連する問題