HOWTO · Csharp

C# lire un fichier CSV et stocker ses valeurs dans un tableau

Cet article pratique montre différentes méthodes pour lire un fichier CSV et stocker ses valeurs dans un tableau en C#. Il présente des méthodes comme OpenRead(), ReadLine() et TextFieldParser

Sur cette page

Un fichier CSV est un fichier séparé par des virgules, qui est utilisé pour stocker des données de manière organisée. Il stocke généralement les données sous forme de tableaux. La plupart des organisations commerciales stockent leurs données dans des fichiers CSV.

En C#, nous pouvons effectuer diverses opérations sur un fichier CSV. Nous pouvons lire, écrire et modifier un fichier CSV. Cet article se concentre sur deux méthodes pour lire un fichier CSV et stocker ses valeurs dans un tableau : lire des lignes avec StreamReader, et analyser des champs avec TextFieldParser.

Les deux exemples utilisent le même fichier d’exemple Data.csv :

Name,Age
Alice,30
Bob,25

Lire un fichier CSV avec StreamReader

La classe StreamReader lit un fichier comme un flux de texte. File.OpenRead() ouvre le fichier, et ReadLine() renvoie une ligne à la fois jusqu’à ce que EndOfStream soit atteint. Le découpage de chaque ligne sur la virgule donne les valeurs individuelles, que l’exemple stocke dans une liste par colonne.

La syntaxe correcte pour utiliser les méthodes OpenRead() et ReadLine() est la suivante :

// OpenRead() Syntax
File.OpenRead(@"FilePath");
// ReadLine() Syntax
StreamReaderObject.ReadLine();

Exemple de code :

using System.IO;
using System.Collections.Generic;
using System;

class ReadingCSV {
  static void Main(string[] args) {
    var reader = new StreamReader(File.OpenRead(@"D:\New folder\Data.csv"));
    List<string> listA = new List<string>();
    List<string> listB = new List<string>();
    while (!reader.EndOfStream) {
      var line = reader.ReadLine();
      var values = line.Split(',');

      listA.Add(values[0]);
      listB.Add(values[1]);
    }
    foreach (var column1 in listA) {
      Console.WriteLine(column1);
    }
    foreach (var column2 in listB) {
      Console.WriteLine(column2);
    }
  }
}

Sortie :

Name
Alice
Bob
Age
30
25

Le découpage sur la virgule fonctionne lorsqu’aucun champ ne contient lui-même une virgule. Un champ entre guillemets tel que "Smith, John" serait découpé au mauvais endroit ; utilisez TextFieldParser pour de tels fichiers.

Analyser les champs CSV avec TextFieldParser

La classe TextFieldParser est définie dans l’espace de noms Microsoft.VisualBasic.FileIO. Elle analyse un fichier délimité champ par champ et comprend les champs entre guillemets. Définissez les délimiteurs avec SetDelimiters(), puis appelez ReadFields() pour obtenir les champs de la ligne actuelle sous forme de tableau de chaînes ; l’analyseur passe à la ligne suivante à chaque appel. Dans un projet .NET Framework, ajoutez une référence à Microsoft.VisualBasic avant d’exécuter le programme ci-dessous ; dans le .NET moderne, l’espace de noms fait partie du framework partagé.

La syntaxe correcte pour utiliser cet analyseur est la suivante :

TextFieldParser ParserName = new TextFieldParser(PathString);

Exemple de code :

using System;
using System.Collections.Generic;
using Microsoft.VisualBasic.FileIO;

class ReadingCSV {
  public static void Main() {
    var path = @"D:\New folder\Data.csv";
    List<string> listA = new List<string>();
    List<string> listB = new List<string>();
    using (TextFieldParser csvReader = new TextFieldParser(path)) {
      csvReader.CommentTokens = new string[] { "#" };
      csvReader.SetDelimiters(new string[] { "," });
      csvReader.HasFieldsEnclosedInQuotes = true;

      // Skip the row with the column names
      csvReader.ReadLine();

      while (!csvReader.EndOfData) {
        // Read current line fields, pointer moves to the next line.
        string[] fields = csvReader.ReadFields();
        listA.Add(fields[0]);
        listB.Add(fields[1]);
      }
    }
    foreach (var column1 in listA) {
      Console.WriteLine(column1);
    }
    foreach (var column2 in listB) {
      Console.WriteLine(column2);
    }
  }
}

Sortie :

Alice
Bob
30
25

Cette fois, la ligne d’en-tête est ignorée grâce au ReadLine() initial, et c’est l’analyseur, et non un découpage manuel, qui décide où chaque champ se termine, de sorte qu’une virgule entre guillemets à l’intérieur d’un champ reste intacte.