Ich versuche, csv
Zeile für Zeile mit der Sprache C # in eine Datei zu schreiben . Hier ist meine Funktion
string first = reader[0].ToString();
string second=image.ToString();
string csv = string.Format("{0},{1}\n", first, second);
File.WriteAllText(filePath, csv);
Die gesamte Funktion wird in einer Schleife ausgeführt, und jede Zeile sollte in die csv
Datei geschrieben werden. In meinem Fall überschreibt die nächste Zeile die vorhandene Zeile und am Ende erhalte ich einen einzigen Datensatz in der CSV-Datei, der letzte. Wie kann ich alle Zeilen in die csv
Datei schreiben ?
StringBuilder
und machen Sie dann einen Save?Util.WriteCsv (mydatacollection, @"c:\temp\data.csv");
Antworten:
AKTUALISIEREN
In meinen naiven Tagen schlug ich vor, dies manuell zu tun (es war eine einfache Lösung für eine einfache Frage). Da dies jedoch immer beliebter wurde, würde ich empfehlen, die Bibliothek CsvHelper zu verwenden , die alle Sicherheitsüberprüfungen usw. durchführt.
CSV ist viel komplizierter als die Frage / Antwort vermuten lässt.
Ursprüngliche Antwort
Da Sie bereits eine Schleife haben, sollten Sie dies folgendermaßen tun:
Oder etwas in diesem Sinne. Meine Argumentation lautet: Sie müssen nicht für jedes Element in die Datei schreiben, sondern öffnen den Stream nur einmal und schreiben dann darauf.
Sie können ersetzen
mit
Wenn Sie frühere Versionen von CSV in derselben Datei behalten möchten
C # 6
Wenn Sie c # 6.0 verwenden, können Sie Folgendes tun
BEARBEITEN
Hier ist ein Link zu einer Frage, die erklärt, was
Environment.NewLine
funktioniert.quelle
{2}
undEnvironment.NewLine
verwendenAppendLine
stattAppend
System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator
anstelle von Komma verwenden.Ich würde Ihnen wärmstens empfehlen, den mühsameren Weg zu gehen. Vor allem, wenn Ihre Datei groß ist.
File.AppendAllText()
öffnet eine neue Datei, schreibt den Inhalt und schließt die Datei. Das Öffnen von Dateien ist viel ressourcenintensiver als das Schreiben von Daten in einen offenen Stream. Das Öffnen / Schließen einer Datei innerhalb einer Schleife führt zu Leistungseinbußen.Der von Johan vorgeschlagene Ansatz löst dieses Problem, indem die gesamte Ausgabe im Speicher gespeichert und dann einmal geschrieben wird. Das Programm (bei großen Dateien) verbraucht jedoch viel RAM und stürzt sogar ab
OutOfMemoryException
Ein weiterer Vorteil meiner Lösung besteht darin, dass Sie das Anhalten und Fortsetzen implementieren können, indem Sie die aktuelle Position in den Eingabedaten speichern.
upd. Platziert mit an der richtigen Stelle
quelle
using
Anweisung einfügen. Andernfalls werden Sie die Datei immer wieder neu öffnen.Das manuelle Schreiben von CSV-Dateien kann schwierig sein, da Ihre Daten möglicherweise Kommas und Zeilenumbrüche enthalten. Ich schlage vor, Sie verwenden stattdessen eine vorhandene Bibliothek.
Diese Frage erwähnt einige Optionen.
Gibt es CSV-Lese- / Schreibbibliotheken in C #?
quelle
Ich verwende eine Zwei-Analyse-Lösung, da diese sehr einfach zu warten ist
quelle
File.AppendAllLines(filePath, lines, Encoding.ASCII);
anstelle vonFile.WriteAllText(filePath, csv.ToString());
Also mache ich etwas sehr Klobiges. Nachdem ich die CSV mit StringBuilder erstellt habe, konvertiere ich sie in eine List <string>, um eine IEnumerable für den Aufruf von AppendAllLines zu erhalten, die csv.ToString () nicht als Parameter akzeptiert:List<string> lines = new List<string>(); lines.Add(csv.ToString(0, csv.Length));
Haben Sie eine bessere Möglichkeit, dies zu tun?Anstatt jedes Mal
AppendAllText()
anzurufen, könnten Sie darüber nachdenken, die Datei einmal zu öffnen und dann den gesamten Inhalt einmal zu schreiben:quelle
Verwenden Sie stattdessen einfach AppendAllText:
Der einzige Nachteil von AppendAllText ist, dass es einen Fehler auslöst, wenn keine Datei vorhanden ist. Daher muss dies überprüft werdenEntschuldigung, blonder Moment vor dem Lesen der Dokumentation . Auf jeden Fall überschreibt die WriteAllText-Methode alles, was zuvor in die Datei geschrieben wurde, sofern die Datei vorhanden ist.
Beachten Sie, dass Ihr aktueller Code keine richtigen neuen Zeilen verwendet. In Notepad wird beispielsweise alles als eine lange Zeile angezeigt. Ändern Sie den Code in diesen, um korrekte neue Zeilen zu erhalten:
quelle
quelle
.Replace(",", ";") + ','
?Anstatt das Rad neu zu erfinden, könnte eine Bibliothek verwendet werden.
CsvHelper
eignet sich hervorragend zum Erstellen und Lesen von CSV-Dateien. Die Lese- und Schreibvorgänge basieren auf Streams und unterstützen daher auch Vorgänge mit einer großen Datenmenge.Sie können Ihre CSV wie folgt schreiben.
Da die Bibliothek Reflektion verwendet, wird jeder Typ verwendet und direkt analysiert.
Wenn Sie mehr über die Bibliothekskonfigurationen und -möglichkeiten erfahren möchten, können Sie dies hier tun .
quelle
Umgang mit Kommas
Für die Behandlung von Kommas innerhalb von Werten bei der Verwendung
string.Format(...)
hat Folgendes bei mir funktioniert:Um es mit Johans Antwort zu kombinieren, würde es so aussehen:
CSV-Datei zurückgeben
Wenn Sie die Datei einfach zurückgeben möchten, anstatt sie an einen Speicherort zu schreiben, ist dies ein Beispiel dafür, wie ich dies erreicht habe:
Aus einer gespeicherten Prozedur
Aus einer Liste
Hoffentlich ist das hilfreich.
quelle
Dies ist ein einfaches Tutorial zum Erstellen von CSV-Dateien mit C #, das Sie bearbeiten und erweitern können, um es Ihren eigenen Anforderungen anzupassen.
Zunächst müssen Sie eine neue Visual Studio C # -Konsolenanwendung erstellen. Dazu müssen Sie die folgenden Schritte ausführen.
Der Beispielcode erstellt eine CSV-Datei mit dem Namen MyTest.csv an dem von Ihnen angegebenen Speicherort. Der Inhalt der Datei sollte aus 3 benannten Spalten mit Text in den ersten 3 Zeilen bestehen.
https://tidbytez.com/2018/02/06/how-to-create-a-csv-file-with-c/
quelle
Möglicherweise müssen Sie nur einen Zeilenvorschub hinzufügen
"\n\r"
.quelle
Hier ist eine weitere Open-Source-Bibliothek zum einfachen Erstellen von CSV-Dateien, Cinchoo ETL
Weitere Informationen finden Sie im CodeProject- Artikel zur Verwendung.
quelle
Eine einfache Möglichkeit, das Problem des Überschreibens
File.AppendText
zu beseitigen, besteht darin, die Zeile am Ende der Datei als anzuhängenquelle
string string_value = string.Empty;
quelle
Dies sollte es Ihnen ermöglichen, ganz einfach eine CSV-Datei zu schreiben. Verwendung:
quelle