38 votes

Lecteur CSV C # très simple

J'aimerais créer un tableau à partir d'un fichier CSV.

C'est à peu près aussi simple que vous pouvez l'imaginer, le fichier CSV n'aura jamais qu'une seule ligne et ces valeurs:

 Device, SignalStrength, Location, Time, Age.
 

Je voudrais mettre ces valeurs dans un tableau à une dimension.

J'ai essayé quelques exemples, mais ils ont tous été plus compliqués que nécessaire.

65voto

Ramesh Points 6909

Vous pouvez essayer quelque chose comme l'extrait LINQ ci-dessous.

 string[] allLines = File.ReadAllLines(@"E:\Temp\data.csv");

    var query = from line in allLines
                let data = line.Split(',')
                select new
                {
                    Device = data[0],
                    SignalStrength = data[1],
                    Location = data[2], 
                    Time = data[3],
                    Age = Convert.ToInt16(data[4])
                };
 

MISE À JOUR: Au fil du temps, les choses ont évolué. À partir de maintenant, je préférerais utiliser cette bibliothèque http://www.aspnetperformance.com/post/LINQ-to-CSV-library.aspx

52voto

Andrew Hare Points 159332

S'il n'y a qu'une seule ligne, faites quelque chose comme ceci:

 using System;
using System.IO;

class Program
{
    static void Main()
    {
    	String[] values = File.ReadAllText(@"d:\test.csv").Split(',');
    }
}
 

16voto

Seth Points 2686

CsvHelper de Josh Close est disponible via NuGet et contient tout ce dont vous avez besoin. Il est toujours activement développé.

8voto

Chris Wilson Points 101

Voici une fonction simple que j'ai faite. Il accepte une chaîne de caractères CSV et renvoie un tableau de champs:

Cela fonctionne bien avec les fichiers CSV générés par Excel et de nombreuses autres variantes.

     public static string[] ParseCsvRow(string r)
    {

        string[] c;
        string t;
        List<string> resp = new List<string>();
        bool cont = false;
        string cs = "";

        c = r.Split(new char[] { ',' }, StringSplitOptions.None);

        foreach (string y in c)
        {
            string x = y;


            if (cont)
            {
                // End of field
                if (x.EndsWith("\""))
                {
                    cs += "," + x.Substring(0, x.Length - 1);
                    resp.Add(cs);
                    cs = "";
                    cont = false;
                    continue;

                }
                else
                {
                    // Field still not ended
                    cs += "," + x;
                    continue;
                }
            }

            // Fully encapsulated with no comma within
            if (x.StartsWith("\"") && x.EndsWith("\""))
            {
                if ((x.EndsWith("\"\"") && !x.EndsWith("\"\"\"")) && x != "\"\"")
                {
                    cont = true;
                    cs = x;
                    continue;
                }

                resp.Add(x.Substring(1, x.Length - 2));
                continue;
            }

            // Start of encapsulation but comma has split it into at least next field
            if (x.StartsWith("\"") && !x.EndsWith("\""))
            {
                cont = true;
                cs += x.Substring(1);
                continue;
            }

            // Non encapsulated complete field
            resp.Add(x);

        }

        return resp.ToArray();

    }
 

3voto

mdb Points 20629

Jetez un coup d'œil aux fichiers open source FileHelpers for .NET de Marcos Meli. L'exemple de démarrage rapide délimité devrait faire à peu près ce que vous voulez, et le cadre est également très utile pour d'autres scénarios.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X