16 Stimmen

Wie kann ich Zeilenumbrüche in einer CSV-Datei mit C# behandeln?

Ich habe eine Excel-Tabelle, die in eine CSV-Datei in C# konvertiert wird, aber ich habe ein Problem mit Zeilenumbrüchen zu behandeln. Zum Beispiel:

"John","23","555-5555"

"Peter","24","555-5
555"

"Mary,"21","555-5555"

Wenn ich die CSV-Datei lese und der Datensatz nicht mit einem doppelten Anführungszeichen (") beginnt, wird versehentlich ein Zeilenumbruch eingefügt, den ich entfernen muss. Ich habe einige CSV-Reader-Klassen aus dem Internet, aber ich befürchte, dass sie an den Zeilenumbrüchen scheitern werden.

Wie soll ich mit diesen Zeilenumbrüchen umgehen?


Vielen Dank an alle für ihre Hilfe.

Hier ist, was ich bis jetzt gemacht habe. Meine Datensätze haben ein festes Format und beginnen alle mit

JTW;...;....;...;

JTW;...;...;....

JTW;....;...;..

..;...;... (wrong record, line break inserted)

JTW;...;...

Also habe ich nach dem ; an der Position [3] jeder Zeile. Wenn true, schreibe ich; wenn false, füge ich an die letzte Zeile an (und entferne den Zeilenumbruch)

Ich habe jetzt Probleme, weil ich die Datei als txt-Datei speichere.

Übrigens konvertiere ich die Excel-Tabelle in eine csv-Datei, indem ich sie in Excel als csv-Datei speichere. Ich bin mir aber nicht sicher, ob der Kunde das auch tut.

Die Datei im TXT-Format ist also perfekt. Ich habe die Datensätze und Summen überprüft. Aber jetzt muss ich sie wieder in eine CSV-Datei umwandeln, und das würde ich gerne im Programm machen. Weiß jemand, wie das geht?

Hier ist mein Code:

namespace EditorCSV
{
    class Program
    {
        static void Main(string[] args)
        {
            ReadFromFile("c:\\source.csv");
        }

        static void ReadFromFile(string filename)
        {
            StreamReader SR;
            StreamWriter SW;
            SW = File.CreateText("c:\\target.csv");
            string S;
            char C='a';
            int i=0;
            SR=File.OpenText(filename);
            S=SR.ReadLine();
            SW.Write(S);
            S = SR.ReadLine();
            while(S!=null)
            {
                try { C = S[3]; }
                catch (IndexOutOfRangeException exception){
                    bool t = false;
                    while (t == false)
                    {
                        t = true;
                        S = SR.ReadLine();
                        try { C = S[3]; }
                        catch (IndexOutOfRangeException ex) { S = SR.ReadLine(); t = false; }

                    }
                }
                if( C.Equals(';'))
                {
                    SW.Write("\r\n" + S);
                    i = i + 1;
                }
                else
                {
                    SW.Write(S);

                }
                S=SR.ReadLine();
            }
            SR.Close();
            SW.Close();
            Console.WriteLine("Records Processed: " + i.ToString() + " .");
            Console.WriteLine("File Created SucacessFully");
            Console.ReadKey();

        }

    }
}

0 Stimmen

Vielleicht verstehe ich das falsch, aber analysieren Sie die Excel-Datei in eine CSV-Datei und haben dann ein Problem, wenn Sie versuchen, sie zu lesen? Wenn das der Fall ist, wie sieht dann der Code aus, mit dem Sie die Excel-Datei in eine CSV-Datei umwandeln?

0 Stimmen

Erzeugen Sie die csv, lesen Sie die csv oder beides?

1 Stimmen

Ah, die Freuden des CSV-Parsing. Es sieht ziemlich einfach aus, hat aber ein paar unangenehme Nebeneffekte.

17voto

Michael La Voie Punkte 26963

CSV hat vordefinierte Möglichkeiten, dies zu handhaben. Diese Website bietet eine leicht verständliche Erklärung des Standards eine Möglichkeit, mit allen Vorbehalten gegenüber CSV umzugehen .

Nichtsdestotrotz gibt es keinen Grund, nicht eine solide Open-Source-Bibliothek zum Lesen und Schreiben von CSV-Dateien zu verwenden, um nicht-standardisierte Fehler zu vermeiden. LINQtoCSV ist meine Lieblingsbibliothek für diesen Zweck. Sie unterstützt das Lesen und Schreiben auf eine saubere und einfache Weise.

Alternativ dazu, diese SO-Frage zu CSV-Bibliotheken finden Sie die Liste der beliebtesten Angebote.

6voto

Doug Punkte 1568

Anstatt zu prüfen, ob in der aktuellen Zeile das (") als erstes Zeichen fehlt, prüfen Sie stattdessen, ob das letzte Zeichen ein (") ist. Ist dies nicht der Fall, wissen Sie, dass Sie einen Zeilenumbruch haben, und Sie können die nächste Zeile lesen und zusammenfügen.

Ich gehe davon aus, dass Ihre Beispieldaten korrekt waren - die Felder waren in Anführungszeichen eingeschlossen. Wenn Anführungszeichen ein Textfeld nicht abgrenzen (oder Zeilenumbrüche in Nicht-Text-Daten gefunden werden), dann ist alles möglich!

3 Stimmen

Einige CSV-Anwendungen umschließen bei der Erstellung von CSV-Dateien nicht jedes Feld mit Anführungszeichen, so dass diese Lösung fehlerhaft sein könnte.

2 Stimmen

Ich bin natürlich davon ausgegangen, dass seine Beispieldaten korrekt waren - die Felder waren in Anführungszeichen eingeschlossen. Wenn Anführungszeichen ein Textfeld nicht abgrenzen (oder Zeilenumbrüche in Nicht-Text-Daten vorkommen), dann ist alles möglich!

0 Stimmen

Doug, vielleicht sollten Sie die Annahme in Ihre Antwort aufnehmen

3voto

Josh Close Punkte 21609

Essayez CsvHelper (eine von mir betreute Bibliothek). Sie ignoriert leere Zeilen. Ich glaube, es gibt ein Flag, das Sie in FastCsvReader setzen können, damit es auch leere Zeilen behandelt.

1 Stimmen

Das ist auch das Schnellste, was ich gefunden habe. Vielen Dank dafür, Josh.

3voto

Michael Punkte 10451

Es gibt eine eingebaute Methode zum Lesen von CSV-Dateien in .NET (erfordert eine hinzugefügte Microsoft.VisualBasic Assembly-Referenz):

public static IEnumerable<string[]> ReadSV(TextReader reader, params string[] separators)
{
    var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(reader);
    parser.SetDelimiters(separators);
    while (!parser.EndOfData)
        yield return parser.ReadFields();
}

Wenn Sie mit wirklich großen Dateien zu tun haben, ist dieser CSV-Reader angeblich der schnellste, den Sie finden können: http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader

3voto

Beherzigen Sie die Ratschläge der Experten und Entwickeln Sie nicht Ihren eigenen CSV-Parser .

Ihr erster Gedanke ist: "Wie gehe ich mit neuen Zeilenumbrüchen um?"

Ihr nächster Gedanke ist: "Ich muss mit Kommas innerhalb von Anführungszeichen umgehen".

Ihr nächster Gedanke wird sein: "Oh, Mist, ich muss mit Anführungszeichen innerhalb von Anführungszeichen umgehen. Entgangene Anführungszeichen. Doppelte Anführungszeichen. Einfache Anführungszeichen..."

Es ist ein Weg zum Wahnsinn. Schreiben Sie nicht Ihr eigenes Buch. Finden Sie eine Bibliothek mit einer umfangreichen Unit-Test-Abdeckung, die alle schwierigen Teile trifft und für Sie durch die Hölle gegangen ist. Verwenden Sie für .NET die freie CsvHelper-Bibliothek .

1 Stimmen

Ich bin auf die von Ihnen beschriebenen Probleme in der von Ihnen beschriebenen Reihenfolge gestoßen, bevor ich hierher gestolpert bin

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X