Könnte mir bitte jemand sagen, warum der folgende Code nicht funktioniert. Die Daten werden in der CSV-Datei gespeichert, die Daten werden jedoch nicht getrennt. Es existiert alles in der ersten Zelle jeder Zeile.
StringBuilder sb = new StringBuilder();
foreach (DataColumn col in dt.Columns)
{
sb.Append(col.ColumnName + ',');
}
sb.Remove(sb.Length - 1, 1);
sb.Append(Environment.NewLine);
foreach (DataRow row in dt.Rows)
{
for (int i = 0; i < dt.Columns.Count; i++)
{
sb.Append(row[i].ToString() + ",");
}
sb.Append(Environment.NewLine);
}
File.WriteAllText("test.csv", sb.ToString());
Vielen Dank.
c#
csv
delimited-text
Darren Young
quelle
quelle
Antworten:
Die folgende kürzere Version wird in Excel problemlos geöffnet. Möglicherweise war Ihr Problem das nachfolgende Komma
.net = 3.5
.net> = 4.0
Und wie Tim betonte, können Sie es noch kürzer machen, wenn Sie auf .net> = 4 sind:
Ersetzen Sie, wie von Christian vorgeschlagen, den Schleifenblock durch:
Und letzter Vorschlag: Sie könnten den CSV-Inhalt Zeile für Zeile anstatt als ganzes Dokument schreiben, um zu vermeiden, dass sich ein großes Dokument im Speicher befindet.
quelle
ItemArray
in ein neues kopierenString[]
, sondern können es.ToArray()
mit .NET 4 weglassen und dieString.Join
Überlastung verwenden , die einIEnumerable<T>
(bearbeitetes) erfordert . 
ist typisch für HTML / XML-Dokumente. Es ist nicht der obige Code, der es erzeugt, es sei denn, die Tabelle enthält
explizitIch habe dies in eine Erweiterungsklasse eingepackt, mit der Sie Folgendes aufrufen können:
auf einer beliebigen Datentabelle.
quelle
Eine neue Erweiterungsfunktion basierend auf Paul Grimshaws Antwort. Ich habe es bereinigt und die Möglichkeit hinzugefügt, mit unerwarteten Daten umzugehen. (Leere Daten, eingebettete Anführungszeichen und Kommas in den Überschriften ...)
Es wird auch eine Zeichenfolge zurückgegeben, die flexibler ist. Es gibt Null zurück, wenn das Tabellenobjekt keine Struktur enthält.
Sie nennen es wie folgt:
quelle
Wenn Ihr aufrufender Code auf die
System.Windows.Forms
Assembly verweist , können Sie einen radikal anderen Ansatz in Betracht ziehen. Meine Strategie besteht darin, die bereits vom Framework bereitgestellten Funktionen zu verwenden, um dies in sehr wenigen Codezeilen zu erreichen, ohne Spalten und Zeilen durchlaufen zu müssen. Der folgende Code erstellt programmgesteuert einDataGridView
On-the-Fly und setzt dasDataGridView.DataSource
aufDataTable
. Als nächstes wähle ich programmgesteuert alle Zellen (einschließlich der Kopfzeile) imDataGridView
Aufruf ausDataGridView.GetClipboardContent()
und platziere die Ergebnisse in WindowsClipboard
. Dann füge ich den Inhalt der Zwischenablage in einen Aufruf von einFile.WriteAllText()
und stelle dabei sicher, dass die Formatierung des Einfügens als angegeben wirdTextDataFormat.CommaSeparatedValue
.Hier ist der Code:
Beachten Sie, dass ich auch sicherstellen muss, dass der Inhalt der Zwischenablage erhalten bleibt, bevor ich beginne, und ihn wiederherstelle, sobald ich fertig bin, damit der Benutzer beim nächsten Versuch, ihn einzufügen, keinen unerwarteten Müll bekommt. Die wichtigsten Einschränkungen bei diesem Ansatz sind: 1) Ihre Klasse muss sich darauf beziehen
System.Windows.Forms
, was in einer Datenabstraktionsschicht möglicherweise nicht der Fall ist. 2) Ihre Assembly muss auf das .NET 4.5-Framework ausgerichtet sein, da DataGridView in 4.0 nicht vorhanden ist. und 3) Die Methode schlägt fehl, wenn die Zwischenablage von einem anderen Prozess verwendet wird.Auf jeden Fall ist dieser Ansatz möglicherweise nicht für Ihre Situation geeignet, aber dennoch interessant und kann ein weiteres Werkzeug in Ihrer Toolbox sein.
quelle
.GetClipboardContent
behandelt auch einige Randfälle von Werten, die enthalten,
."
,\t
(es wandelt Tab in Leerzeichen um)Ich habe dies kürzlich getan, aber meine Werte in doppelte Anführungszeichen gesetzt.
Ändern Sie beispielsweise diese beiden Zeilen:
quelle
Versuchen Sie ,
sb.Append(Environment.NewLine);
zusb.AppendLine();
.quelle
Versuchen Sie , setzen
;
statt,
Ich hoffe es hilft
quelle
Dies und das lesen ?
Eine bessere Umsetzung wäre
quelle
Der Fehler ist das Listentrennzeichen.
Anstatt zu schreiben
sb.Append(something... + ',')
, sollten Sie so etwas wie setzensb.Append(something... + System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator);
Sie müssen das in Ihrem Betriebssystem konfigurierte Listentrennzeichen (wie im obigen Beispiel) oder das Listentrennzeichen auf dem Clientcomputer einfügen, auf dem die Datei überwacht werden soll. Eine andere Möglichkeit wäre, es in der app.config oder web.config als Parameter Ihrer Anwendung zu konfigurieren.
quelle
4 Codezeilen:
Beachten Sie, dass das
ToList()
am Ende wichtig ist; Ich brauche etwas, um eine Ausdrucksbewertung zu erzwingen. Wenn ich Code Golf spielen würde, könnte ichMin()
stattdessen verwenden.Beachten Sie auch, dass das Ergebnis aufgrund des letzten Aufrufs von am Ende eine neue Zeile enthält
AppendLine()
. Sie können dies nicht wollen. Sie können einfach anrufenTrimEnd()
, um es zu entfernen.quelle
Hier ist eine Erweiterung des Beitrags von vc-74, die Kommas genauso behandelt wie Excel. Excel setzt Daten in Anführungszeichen, wenn die Daten ein Komma haben, aber keine Anführungszeichen, wenn die Daten kein Komma haben.
quelle
Um in eine Datei zu schreiben, halte ich die folgende Methode für die effizienteste und einfachste: (Sie können Anführungszeichen hinzufügen, wenn Sie möchten)
quelle
So ahmen Sie Excel CSV nach:
quelle
quelle
quelle
Möglicherweise ist der einfachste Weg zu verwenden:
https://github.com/ukushu/DataExporter
/r/n
Dies gilt insbesondere für Daten von Datentabellen, die Zeichen oder Trennzeichen in Ihren dataTable-Zellen enthalten. Fast alle anderen Antworten funktionieren mit solchen Zellen nicht.Sie müssen lediglich den folgenden Code schreiben:
quelle
Für den Fall, dass jemand anderes darauf stößt , habe ich File.ReadAllText verwendet , um CSV-Daten abzurufen . Dann habe ich sie geändert und mit File.WriteAllText zurückgeschrieben . Die \ r \ n CRLFs waren in Ordnung, aber die \ t-Registerkarten wurden beim Öffnen in Excel ignoriert. (Alle Lösungen in diesem Thread verwenden bisher ein Komma-Trennzeichen, aber das spielt keine Rolle.) Notepad zeigte in der resultierenden Datei das gleiche Format wie in der Quelle. Ein Diff zeigte sogar die Dateien als identisch an. Aber ich habe einen Hinweis bekommen, als ich die Datei in Visual Studio mit einem Binäreditor geöffnet habe. Die Quelldatei war Unicode, aber das Ziel war ASCII . Um dies zu beheben, habe ich sowohl ReadAllText als auch WriteAllText mit dem dritten Argument als System.Text.Encoding.Unicode geändert und von dort aus konnte Excel die aktualisierte Datei öffnen.
quelle
EJR
quelle
Hier ist meine Lösung, basierend auf früheren Antworten von Paul Grimshaw und Anthony VO . Ich habe die eingereicht Code in einem C # -Projekt auf Github .
Mein Hauptbeitrag besteht darin, das explizite Erstellen und Manipulieren von a zu eliminieren
StringBuilder
und stattdessen nur mit zu arbeitenIEnumerable
. Dies vermeidet die Zuweisung eines großen Puffers im Speicher.}}
Dieser Ansatz kombiniert gut mit der Umwandlung
IEnumerable
zu Datatable wie hier gefragt .quelle
Ich musste auch einige Daten überschreiben, weshalb es einige "if else" -Anweisungen gibt. Ich musste sicherstellen, dass ein Feld, das leer war, um stattdessen "N / A" einzugeben, oder wenn ein Datumsfeld als "01/01/1900: 00" formatiert wurde, als "01/01/1900" gespeichert wird. stattdessen.
quelle
quelle
Wenn sich alle Daten noch in der ersten Zelle befinden, bedeutet dies, dass die Anwendung, mit der Sie die Datei geöffnet haben, ein anderes Trennzeichen erwartet. MSExcel kann das Komma als Trennzeichen behandeln, sofern Sie nichts anderes angegeben haben.
quelle