web-dev-qa-db-fra.com

Vous lisez un fichier CSV dans .NET?

Comment lire un fichier CSV en utilisant C #?

43
Janmejay

Un choix, sans utiliser de composants tiers, est d'utiliser la classe Microsoft.VisualBasic.FileIO.TextFieldParser ( http://msdn.Microsoft.com/en-us/library/Microsoft.visualbasic.fileio.textfieldparser.aspx ). Il fournit toutes les fonctions pour analyser CSV. Il suffit d'importer l'assembly Microsoft.VisualBasic.

var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(file);
parser.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;
parser.SetDelimiters(new string[] { ";" });

while (!parser.EndOfData)
{
    string[] row = parser.ReadFields();
    /* do something */
}
57
wahrheit

Vous pouvez utiliser la classe Microsoft.VisualBasic.FileIO.TextFieldParser en C #:

using System;
using System.Data;
using Microsoft.VisualBasic.FileIO;

static void Main()
{
    string csv_file_path = @"C:\Users\Administrator\Desktop\test.csv";

    DataTable csvData = GetDataTableFromCSVFile(csv_file_path);

    Console.WriteLine("Rows count:" + csvData.Rows.Count);    
    Console.ReadLine();
}

private static DataTable GetDataTableFromCSVFile(string csv_file_path)
{
    DataTable csvData = new DataTable();

    try
    {
        using(TextFieldParser csvReader = new TextFieldParser(csv_file_path))
        {
            csvReader.SetDelimiters(new string[] { "," });
            csvReader.HasFieldsEnclosedInQuotes = true;
            string[] colFields = csvReader.ReadFields();

            foreach (string column in colFields)
            {
                DataColumn datecolumn = new DataColumn(column);
                datecolumn.AllowDBNull = true;
                csvData.Columns.Add(datecolumn);
            }

            while (!csvReader.EndOfData)
            {
                string[] fieldData = csvReader.ReadFields();
                //Making empty value as null
                for (int i = 0; i < fieldData.Length; i++)
                {
                    if (fieldData[i] == "")
                    {
                        fieldData[i] = null;
                    }
                }

                csvData.Rows.Add(fieldData);
             }
         }
     }
     catch (Exception ex)
     {
     }

     return csvData;
}
21
kombsh

Vous pouvez essayer CsvHelper , qui est un projet sur lequel je travaille. Son objectif est de rendre la lecture et l'écriture des fichiers CSV aussi simples que possible, tout en étant très rapides.

Voici quelques façons de lire un fichier CSV.

// By type
var records = csv.GetRecords<MyClass>();
var records = csv.GetRecords( typeof( MyClass ) );

// Dynamic
var records = csv.GetRecords<dynamic>();

// Using anonymous type for the class definition
var anonymousTypeDefinition =
{
    Id = default( int ),
    Name = string.Empty,
    MyClass = new MyClass()
};
var records = csv.GetRecords( anonymousTypeDefinition );
7
Josh Close

Je viens d'utiliser cette bibliothèque dans mon application. http://www.codeproject.com/KB/database/CsvReader.aspx . Tout s'est bien passé en utilisant cette bibliothèque, donc je la recommande. Il est gratuit sous la licence MIT, alors incluez simplement l'avis avec vos fichiers source.

Je n'ai pas affiché le CSV dans un navigateur, mais l'auteur a quelques exemples pour Repeaters ou DataGrids. J'ai exécuté l'un de ses projets de test pour tester une opération de tri que j'ai ajoutée et cela avait l'air plutôt bien.

4
John Hoven

Je recommande Angara.Table, à propos de l'enregistrement/du chargement: http://predictionmachines.github.io/Angara.Table/saveload.html .

Il fait l'inférence des types de colonnes, peut enregistrer des fichiers CSV et est beaucoup plus rapide que TextFieldParser. Il suit la RFC4180 pour le format CSV et prend en charge les chaînes multilignes, les NaN et les chaînes d'échappement contenant le caractère délimiteur.

La bibliothèque est sous MIT license. Le code source est https://github.com/Microsoft/Angara.Table .

Bien que son API se concentre sur F #, elle peut être utilisée dans n'importe quel langage .NET mais pas aussi succincte qu'en F #.

Exemple:

using Angara.Data;
using System.Collections.Immutable;

...

var table = Table.Load("data.csv");

// Print schema:
foreach(Column c in table)
{
    string colType;
    if (c.Rows.IsRealColumn) colType = "double";
    else if (c.Rows.IsStringColumn) colType = "string";
    else if (c.Rows.IsDateColumn) colType = "date";
    else if (c.Rows.IsIntColumn) colType = "int";
    else colType = "bool";

    Console.WriteLine("{0} of type {1}", c.Name, colType);
}

// Get column data:
ImmutableArray<double> a = table["a"].Rows.AsReal;
ImmutableArray<string> b = table["b"].Rows.AsString;

Table.Save(table, "data2.csv");
2

Vous pouvez essayer Cinchoo ETL - une bibliothèque open source pour lire et écrire des fichiers CSV.

Deux façons de lire des fichiers CSV

Id, Name
1, Tom
2, Mark

Voici comment utiliser cette bibliothèque pour la lire

using (var reader = new ChoCSVReader("emp.csv").WithFirstLineHeader())
{
   foreach (dynamic item in reader)
   {
      Console.WriteLine(item.Id);
      Console.WriteLine(item.Name);
   }
}

Si vous avez un objet POCO défini pour correspondre au fichier CSV comme ci-dessous

public class Employee
{
   public int Id { get; set; }
   public string Name { get; set; }
}

Vous pouvez analyser le même fichier en utilisant cette classe POCO comme ci-dessous

using (var reader = new ChoCSVReader<Employee>("emp.csv").WithFirstLineHeader())
{
   foreach (var item in reader)
   {
      Console.WriteLine(item.Id);
      Console.WriteLine(item.Name);
   }
}

Veuillez consulter les articles à CodeProject sur la façon de l'utiliser.

Avertissement: je suis l'auteur de cette bibliothèque

1
RajN

J'utilise généralement une approche simpliste comme celle-ci:

var path = Server.MapPath("~/App_Data/Data.csv");
var csvRows = System.IO.File.ReadAllLines(path, Encoding.Default).ToList();

foreach (var row in csvRows.Skip(1))
{
    var columns = row.Split(';');

    var field1 = columns[0];
    var field2 = columns[1];
    var field3 = columns[2];
}
1
MichaelCleverly

Vous pourriez être intéressé par la bibliothèque Linq2Csv sur CodeProject . Une chose que vous devez vérifier est que si elle lit les données alors qu'elles en ont besoin, vous n'aurez donc pas besoin de beaucoup de mémoire lorsque vous travaillez avec des fichiers plus gros.

Quant à l'affichage des données sur le navigateur, vous pouvez faire beaucoup de choses pour y parvenir, si vous souhaitez être plus précis sur vos besoins, la réponse pourrait être plus spécifique, mais les choses que vous pourriez faire:
1. Utilisez la classe HttpListener pour écrire un serveur Web simple (vous pouvez trouver de nombreux exemples sur le net pour héberger un serveur mini-http).
2. Utilisez Asp.Net ou Asp.Net Mvc, créez une page, hébergez-la en utilisant IIS.

1
Marcin Deptuła

Il semble qu'il y ait pas mal de projets sur CodeProject ou CodePlex pour l'analyse CSV. Voici un autre analyseur CSV sur CodePlex

http://commonlibrarynet.codeplex.com/

Cette bibliothèque contient des composants pour l'analyse CSV, INI analyse de fichier, analyse de ligne de commande également. Cela fonctionne bien pour moi jusqu'à présent. La seule chose est qu'elle n'a pas d'écrivain CSV.

1
alex

Je gère un projet open source appelé FlatFiles depuis plusieurs années maintenant. Il est disponible pour .NET Core et .NET 4.5.1.

Contrairement à la plupart des alternatives, il vous permet de définir un schéma (similaire à la façon dont le code EF fonctionne d'abord) avec un niveau de précision extrême, de sorte que vous ne combattez pas les problèmes de conversion tout le temps. Vous pouvez mapper directement à vos classes de données et il existe également une prise en charge pour l'interfaçage avec les anciennes classes ADO.NET.

En termes de performances, il a été réglé pour être l'un des analyseurs les plus rapides pour .NET, avec une pléthore d'options pour les différences de format originales. Il existe également un support pour les fichiers de longueur fixe, si vous en avez besoin.

1
Travis Parks

C'est juste pour analyser le CSV. Pour l'afficher dans une page Web, il suffit de prendre la liste et de la rendre comme vous le souhaitez.

Remarque: Cet exemple de code ne gère pas la situation où la chaîne d'entrée line contient des sauts de ligne.

public List<string> SplitCSV(string line)
{
    if (string.IsNullOrEmpty(line))
        throw new ArgumentException();

    List<string> result = new List<string>();

    int index = 0;
    int start = 0;
    bool inQuote = false;
    StringBuilder val = new StringBuilder();

    // parse line
    foreach (char c in line)
    {
        switch (c)
        {
            case '"':
                inQuote = !inQuote;
                break;

            case ',':
                if (!inQuote)
                {
                    result.Add(line.Substring(start, index - start)
                        .Replace("\"",""));

                    start = index + 1;
                }

                break;
            }

            index++;
        }

        if (start < index)
        {
            result.Add(line.Substring(start, index - start).Replace("\"",""));
        }

        return result;
    }
}
1
Freddy