Gewusst wie: Neuordnen der Felder einer Datei mit Trennzeichen (LINQ)

Aktualisiert: November 2007

Eine durch Kommas getrennte Wertdatei (CSV) ist eine Textdatei, die häufig verwendet wird, um Tabellenkalkulationsdaten oder andere Tabellendaten, die durch Reihen und Spalten dargestellt werden, zu speichern. Durch Anwendung der Split-Methode zum Trennen der Felder ist es ein Leichtes, mit LINQ CSV-Dateien abzufragen und zu verändern. Das gleiche Verfahren kann auch genutzt werden, um die Teile einer beliebigen strukturierten Textzeile neu zu ordnen. Es beschränkt sich nicht nur auf CSV-Dateien.

Nehmen wir im folgenden Beispiel an, dass die drei Spalten die "Nachnamen", "Vornamen" und "IDs" von Studierenden darstellen. Die Felder sind in alphabetischer Reihenfolge nach den Nachnamen der Studierenden geordnet. Die Abfrage erstellt eine neue Sequenz, in der die ID-Spalte zuerst angezeigt wird, gefolgt von einer zweiten Spalte, in der der Nachname und der Vorname der Studierenden kombiniert werden. Die Zeilen werden nach dem ID-Feld neu angeordnet. Die Ergebnisse werden in eine neue Datei gespeichert, wobei die ursprünglichen Daten nicht geändert werden.

So erstellen Sie die Datendatei

  • Erstellen Sie ein neues Visual C#- oder Visual Basic-Projekt, und kopieren Sie die folgenden Zeilen in eine Nur-Text-Datei mit dem Namen spreadsheet1.csv. Speichern Sie die Datei in Ihrem Projektmappenordner.

    Adams,Terry,120
    Fakhouri,Fadi,116
    Feng,Hanying,117
    Garcia,Cesar,114
    Garcia,Debra,115
    Garcia,Hugo,118
    Mortensen,Sven,113
    O'Donnell,Claire,112
    Omelchenko,Svetlana,111
    Tucker,Lance,119
    Tucker,Michael,122
    Zabokritski,Eugene,121
    

Beispiel

Class CSVFiles

    Shared Sub Main()

        ' Create the IEnumerable data source.
        Dim lines As String() = System.IO.File.ReadAllLines("../../../spreadsheet1.csv")

        ' Execute the query. Put field 2 first, then
        ' reverse and combine fields 0 and 1 from the old field
        Dim lineQuery = From line In lines _
                        Let x = line.Split(New Char() {","}) _
                        Order By x(2) _
                        Select x(2) & ", " & (x(1) & " " & x(0))

        ' Execute the query and write out the new file. Note that WriteAllLines
        ' takes a string array, so ToArray is called on the query.
        System.IO.File.WriteAllLines("../../../spreadsheet2.csv", lineQuery.ToArray())

        ' Keep console window open in debug mode.
        Console.WriteLine("Spreadsheet2.csv written to disk. Press any key to exit")
        Console.ReadKey()
    End Sub
End Class
' Output to spreadsheet2.csv:
' 111, Svetlana Omelchenko
' 112, Claire O'Donnell
' 113, Sven Mortensen
' 114, Cesar Garcia
' 115, Debra Garcia
' 116, Fadi Fakhouri
' 117, Hanying Feng
' 118, Hugo Garcia
' 119, Lance Tucker
' 120, Terry Adams
' 121, Eugene Zabokritski
' 122, Michael Tucker
class CSVFiles
{
    static void Main(string[] args)
    {
        // Create the IEnumerable data source
        string[] lines = System.IO.File.ReadAllLines(@"../../../spreadsheet1.csv");

        // Create the query. Put field 2 first, then
        // reverse and combine fields 0 and 1 from the old field
        IEnumerable<string> query =
            from line in lines
            let x = line.Split(',')
            orderby x[2]
            select x[2] + ", " + (x[1] + " " + x[0]);

        // Execute the query and write out the new file. Note that WriteAllLines
        // takes a string[], so ToArray is called on the query.
        System.IO.File.WriteAllLines(@"../../../spreadsheet2.csv", query.ToArray());

        Console.WriteLine("Spreadsheet2.csv written to disk. Press any key to exit");
        Console.ReadKey();
    }
}
/* Output to spreadsheet2.csv:
111, Svetlana Omelchenko
112, Claire O'Donnell
113, Sven Mortensen
114, Cesar Garcia
115, Debra Garcia
116, Fadi Fakhouri
117, Hanying Feng
118, Hugo Garcia
119, Lance Tucker
120, Terry Adams
121, Eugene Zabokritski
122, Michael Tucker
 */

Kompilieren des Codes

  • Erstellen Sie ein Visual Studio-Projekt, das die .NET Framework-Version 3.5 als Ziel hat. Standardmäßig weist das Projekt einen Verweis auf System.Core.dll und eine using-Direktive (C#) oder eine Imports-Anweisung (Visual Basic) für den System.Linq-Namespace auf. Fügen Sie in C#-Projekten eine using-Direktive für den System.IO-Namespace hinzu.

  • Kopieren Sie diesen Code in Ihr Projekt.

  • Drücken Sie F5, um das Programm zu kompilieren und auszuführen.

  • Drücken Sie eine beliebige Taste, um das Konsolenfenster zu schließen.

Siehe auch

Aufgaben

Gewusst wie: Generieren von XML aus CSV-Dateien

Konzepte

LINQ und Zeichenfolgen

LINQ und Dateiverzeichnisse