2010-08-18 7 views
1

est-il un moyen de lire un fichier csv dans une matrice, de sorte que chaque carré dans le fichier sera une cellule dans la matrice?lire le fichier csv C#

+0

qu'entendez-vous par la matrice? une grille dans une interface utilisateur? si oui, quel cadre d'interface utilisateur? Si non, quel type de structure de données? –

+0

@James - Je pense qu'il veut dire un tableau dans un format matriciel. 'chaîne [,]' –

+0

droite! juste que je veux une matrice int, mais le moulage n'est pas un problème ici ... – aharon

Répondre

3

Il existe de nombreux lecteurs CSV open source, et il est également facile de coder les vôtres.

Pour commencer à prendre, regardez codeplex.com: http://kbcsv.codeplex.com/

Ou tutoriels CodeProject: http://www.codeproject.com/KB/database/CsvReader.aspx

Pour être complet, voici ma propre classe utilitaire pour lire une ligne à partir d'un fichier CSV:

/// <summary> 
    /// Defines CSV reader states 
    /// </summary> 
    enum State 
    { 
     Initial, 
     Quote, 
     Data, 
     NestedQuote 
    } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="CsvReader"/> class. 
    /// </summary> 
    /// <param name="inputStream">The input stream.</param> 
    public CsvReader(Stream inputStream) 
    { 
     if (inputStream == null) 
      throw new ArgumentNullException("inputStream"); 

     reader = new StreamReader(inputStream); 
    } 

    /// <summary> 
    /// Reads a single line of CSV data. 
    /// </summary> 
    /// <returns>Array of CSV fields</returns> 
    public string[] Read() 
    { 
     var line = reader.ReadLine(); 
     var retval = new List<string>(); 

     if (line == null) 
      return null; 

     var state = State.Initial; 
     var text = new StringBuilder(); 

     foreach (var ch in line) 
      switch (state) 
      { 
       case State.Initial: 
        if (ch == '"') 
         state = State.Quote; 
        else if (ch == ',') 
         retval.Add(string.Empty); 
        else 
        { 
         text.Append(ch); 
         state = State.Data; 
        } 

        break; 

       case State.Data: 
        if (ch == ',') 
        { 
         retval.Add(text.ToString()); 
         text.Length = 0; 
         state = State.Initial; 
        } 
        else 
         text.Append(ch); 

        break; 

       case State.Quote: 
        if (ch == '"') 
         state = State.NestedQuote; 
        else 
         text.Append(ch); 

        break; 

       case State.NestedQuote: 
        if (ch == '"') 
        { 
         text.Append('"'); 
         state = State.Quote; 
         break; 
        } 

        state = State.Data; 
        goto case State.Data; 
      } 

     retval.Add(text.ToString()); 

     return retval.ToArray(); 
    } 

    /// <summary> 
    /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. 
    /// </summary> 
    public void Dispose() 
    { 
     reader.Dispose(); 
    } 

Pour faire la matrice (non testé):

var data = new List<string[]>(); 
string[] line; 

using(reader = new CsvReader(stream)) 
    while((line = reader.Read()) != null) 
    data.Add(line); 

result = data.Select(row => row.Select(cell => int.Parse(cell)).ToArray()).ToArray(); 
+1

Est-ce que cela gère les lignes qui contiennent des retours chariot entre guillemets? – cjk

+0

c'est ce que je veux faire: int [] [] mat = LIRE DEPUIS CSV FILE ...; mon fichier csv contient int ... – aharon

+0

non, malheureusement les retours chariot entraînent le début d'une nouvelle ligne: var line = reader.ReadLine(); - J'ai essayé avec Excel (2010), et il n'a pas permis les sauts de ligne entre guillemets, mais je ne connais pas exactement les spécifications – sukru

0

Il existe plusieurs façons. En commençant par un lecteur byte by byte. Cela dépend de votre format de fichier csv (avec/sans en-tête, les fins de ligne, "ou «) J'ai écrit ma propre classe

Un bon lecteur pour commencer:..

http://www.stellman-greene.com/CSVReader/

2

Il est un lecteur de texte dans l'espace de noms Visual Basic qui peut être utilisé en C# et gère même horribles fichiers CSV très bien.

TextFieldParser

il suffit d'ajouter une référence à Microsoft.VisualBasic dans votre projet

+0

j'ai ajouté referenc, mais je ne peux pas voir "FileIO.TextFieldParser" .. – aharon

+0

ohh, maintenant je vois ... mais comment puis-je utiliser le textFieldParser? – aharon

+0

cool je ne savais pas à ce sujet, merci ck – tenfour