2012-06-29 7 views
6

In deutschen Sprache sind Dezimaltrennzeichen, und Werttrennzeichen sind ";" . In Englisch/anderen Sprachen sind Dezimaltrennzeichen. und Wertetrenner sind ",".Schreiben einer .csv-Datei - unabhängig von der Kultur

Ich möchte eine CSV-Datei unabhängig von der aktuellen Kultur erstellen. Ich meine immer, dass die CSV-Datei "." hat Dezimaltrennzeichen und "," hat Werttrennzeichen.

Der Code hierfür ist unten angegeben.

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

Das Problem mit diesem Code ist, wenn OS in Deutsch ist. Die Dezimaltrennzeichen werden "," anstelle von "." Angezeigt.

Bitte lassen Sie mich wissen, der Code fehlt etwas.

+2

_ "Das Problem mit diesem Code ist, wenn OS in Deutsch ist. Die Dezimaltrennzeichen werden angezeigt", "statt". "." _ Das sollte durch die Verwendung von "CultureInfo.InvariantCulture" verhindert werden. Also muss es etwas anderes geben, dass ich noch übersehen werde. –

+0

m_StreamWriter.Write (Werte [i] .ToString (CultureInfo.InvariantCulture)); Ich benutze culture.invariantculture. aber ich bin immer noch nicht in der Lage, den richtigen Wert zu bekommen. – Raghav55

+1

Der mitgelieferte Code funktioniert gut (außer zum Schließen der Ressourcen ;-)) auf einem deutschen Betriebssystem (Windows 7) und die Doubles sind mit einem Punkt "." wie von den Kommentaren erwartet. Selbst wenn die Kultureinstellungen auf "," eingestellt sind. –

Antwort

2

Eine schnelle Lösung, um das deutsche Kulturproblem zu lösen, besteht darin, diese doppelten Werte in Anführungszeichen einzubetten. Ergebnisse:

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

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

+0

IMHO, dies wäre eine bessere Lösung, coherant mit CSV-Parsern – Indy9000

+2

Eine deutsche Excel-Version erwartet '' '' als Trennzeichen zu verwenden. – Joey

+0

Es kommt sehr auf den Leserteil an: Deutsch oder Invariant. –

1

Es gibt keine einfache Lösung für dieses Problem: CSV ist nicht ein Dateiformat-Definition (trotz RFC 4180).

Excel liest und speichert CSV mit dem lokalisierten Listentrennzeichen und lokalisierten Datenformaten, die vom Benutzer festgelegt wurden. Auf diese Weise bedeutet "Komma" in CSV kein Komma, sondern das generische Listentrennzeichen (für viele EU-Länder ist dies das Semikolon, wie Tim Schmelter sagte).

Wenn die Werte in Anführungszeichen eingeschlossen sind, werden sie im Allgemeinen als Zeichenfolgen behandelt. Excel versucht trotzdem, bereits in einer CSV-Zeile enthaltene Elemente zu syntaktisch zu analysieren. Dies scheint in ganz besonderen Fällen zu funktionieren.

Das Problem ist, dass sowohl Schreiber als auch Leser einer CSV-Datei dieselbe Kultur verwenden sollten, da sonst Probleme mit fast allem auftreten, was keine Zeichenkette ist (Zahlen sind Eins, Datum/Zeit sind eine weitere Quelle von Problemen).

Ich verwende eine empirisch abgeleitete Lösung für Daten, bestehend aus der Formatzeichenfolge yyyy/MM/dd HH:mm:ss. Ich habe beobachtet, dass es einen Austausch von Arbeitsdaten zwischen Excel und meinen Programmen ermöglicht, austauschbar in Englisch oder Italienisch.

Ich habe immer noch keine universelle Lösung für Dezimalzahlen gefunden. Ich vermute, dass die wissenschaftliche Notation das tun kann, aber noch keine Zeit zum Testen hatte.

6

Sie können wahrscheinlich Dezimaltrennzeichen und Listentrennzeichen von der aktuellen Kultur erhalten.

Und, wenn der geschriebene Wert eines der Trennzeichen enthält, dann schließen Sie den Wert in doppelte Anführungszeichen ein.

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); 

Aktuelle Kultur Name kann so etwas wie diese: "en-US" für Vereinigte Staaten von Amerika.

Hoffe, das hilft!

Verwandte Themen