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.

2voto

Zoman Punkte 1945

Ich habe dieses Codestück kürzlich verwendet, um Zeilen aus einer CSV-Datei zu analysieren (dies ist eine vereinfachte Version):

private void Parse(TextReader reader)
    {
        var row = new List<string>();
        var isStringBlock = false;
        var sb = new StringBuilder();

        long charIndex = 0;
        int currentLineCount = 0;

        while (reader.Peek() != -1)
        {
            charIndex++;

            char c = (char)reader.Read();

            if (c == '"')
                isStringBlock = !isStringBlock;

            if (c == separator && !isStringBlock) //end of word
            {
                row.Add(sb.ToString().Trim()); //add word
                sb.Length = 0;
            }
            else if (c == '\n' && !isStringBlock) //end of line
            {
                row.Add(sb.ToString().Trim()); //add last word in line
                sb.Length = 0;

                //DO SOMETHING WITH row HERE!

                currentLineCount++;

                row = new List<string>();
            }
            else
            {
                if (c != '"' && c != '\r') sb.Append(c == '\n' ? ' ' : c);
            }
        }

        row.Add(sb.ToString().Trim()); //add last word

        //DO SOMETHING WITH LAST row HERE!
    }

1voto

Freddy Punkte 2846

Vielleicht könnten Sie während ReadLine() nach (") zählen. Wenn sie ungerade sind, wird das Flag ausgelöst. Sie können diese Zeilen entweder ignorieren oder die nächsten zwei Zeilen holen und die erste Zeile " \n "Auftreten der Verschmelzungslinien.

0 Stimmen

String.IsNullOrEmpty(value.Trim()) wäre wahrscheinlich sicherer.

1voto

John Punkte 16598

Normalerweise lese ich den Text nicht zeilenweise, sondern Zeichen für Zeichen, weil ich genau dieses Problem habe.

Während Sie jedes Zeichen lesen, sollten Sie in der Lage sein, herauszufinden, wo jede Zelle beginnt und endet, aber auch den Unterschied zwischen einem Zeilenumbruch in einer Zeile und in einer Zelle: Wenn ich mich richtig erinnere, beginnen die Zeilen in den von Excel generierten Dateien sowieso mit \r\n und Zeilenumbrüche in Zellen sind nur \r.

0voto

Doug Punkte 1568

Es gibt einen Beispielparser in c#, der Ihren Fall korrekt zu behandeln scheint. Dann können Sie Ihre Daten in und bereinigen Sie die Zeilenumbrüche aus es post-read. Teil 2 ist der Parser, und es gibt eine Teil 1 die den Autorenanteil abdeckt.

0voto

FlappySocks Punkte 3644

Lesen Sie die Zeile.
Aufteilung in Spalten (Felder).
Wenn für jede Zeile genügend Spalten erwartet werden, dann verarbeiten Sie sie.
Ist dies nicht der Fall, lesen Sie die nächste Zeile und erfassen Sie die restlichen Spalten, bis Sie das Gewünschte erhalten.
Wiederholen Sie das.

0 Stimmen

Die Trennung kann gefährlich sein, wenn ein Komma zwischen den Anführungszeichen steht. Ein gut formulierter regulärer Ausdruck wäre sicherer.

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