Partager via


Comment : réorganiser les champs d'un fichier délimité (LINQ)

Mise à jour : novembre 2007

Un fichier contenant des valeurs séparées par des virgules (CSV) est un fichier texte qui est souvent utilisé pour stocker des données de feuille de calcul ou d'autres données sous forme de tableau représentées par des lignes et des colonnes. En utilisant la méthode Split pour séparer les champs, il est très facile d'interroger et de manipuler des fichiers CSV à l'aide de LINQ. En fait, la même technique peut être utilisée pour réorganiser les parties de toute ligne de texte structurée ; elle n'est pas limitée aux fichiers CSV.

Dans l'exemple suivant, supposons que les trois colonnes représentent le « nom », le « prénom » et l'« ID» d'étudiants. Les champs sont classés par ordre alphabétique, selon les noms des étudiants. La requête produit une nouvelle séquence dans laquelle la colonne ID apparaît en premier, suivie d'une deuxième colonne qui associe le prénom et le nom de l'étudiant. Les lignes sont réorganisées d'après le champ ID. Les résultats sont enregistrés dans un nouveau fichier et les données d'origine ne sont pas modifiées.

Pour créer le fichier de données

  • Créez un nouveau projet Visual C# ou Visual Basic et copiez les lignes suivantes dans un fichier texte brut nommé spreadsheet1.csv. Enregistrez le fichier dans votre dossier de solution.

    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
    

Exemple

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
 */

Compilation du code

  • Créez un projet Visual Studio qui cible la version 3.5 du .NET Framework. Par défaut, le projet possède une référence à System.Core.dll et une directive using (C#) ou une instruction Imports (Visual Basic) pour l'espace de noms System.Linq. Dans les projets C#, ajoutez une directive using pour l'espace de noms System.IO.

  • Copiez ce code dans votre projet.

  • Appuyez sur F5 pour compiler et exécuter le programme.

  • Appuyez sur une touche pour quitter la fenêtre de console.

Voir aussi

Tâches

Procédure : générer du code XML à partir de fichiers CSV

Concepts

LINQ et chaînes

LINQ et répertoires de fichiers