Чтение файла CSV в .NET? - PullRequest
       90

Чтение файла CSV в .NET?

42 голосов
/ 10 сентября 2009

Как мне прочитать файл CSV с помощью C #?

Ответы [ 11 ]

54 голосов
/ 30 ноября 2011

Выбор без использования сторонних компонентов заключается в использовании класса Microsoft.VisualBasic.FileIO.TextFieldParser (http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx). Он обеспечивает все функции для анализа CSV. Достаточно импортировать сборку 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 */
}
20 голосов
/ 28 августа 2013

Вы можете использовать Microsoft.VisualBasic.FileIO.TextFieldParser класс в 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;
}
6 голосов
/ 23 февраля 2010

Вы можете попробовать CsvHelper , над которым я работаю. Его цель - сделать чтение и запись файлов CSV как можно более простым и быстрым.

Вот несколько способов чтения из файла 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 );
4 голосов
/ 10 сентября 2009

Я только что использовал эту библиотеку в своем приложении. http://www.codeproject.com/KB/database/CsvReader.aspx. С этой библиотекой все прошло гладко, поэтому я рекомендую ее. Это бесплатно по лицензии MIT, поэтому просто включите уведомление с вашими исходными файлами.

Я не отображал CSV в браузере, но у автора есть несколько примеров для Repeaters или DataGrids. Я запустил один из его тестовых проектов для проверки операции сортировки, которую я добавил, и она выглядела довольно хорошо.

2 голосов
/ 21 апреля 2016

Я рекомендую Angara.Table, о сохранении / загрузке: http://predictionmachines.github.io/Angara.Table/saveload.html.

Это делает вывод типов столбцов, может сохранять файлы CSV и намного быстрее, чем TextFieldParser. Он соответствует RFC4180 для формата CSV и поддерживает многострочные строки, NaN и экранированные строки, содержащие символ разделителя.

Библиотека находится под лицензией MIT. Исходный код https://github.com/Microsoft/Angara.Table.

Хотя его API ориентирован на F #, он может использоваться на любом языке .NET, но не так кратко, как в F #.

Пример:

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");
1 голос
/ 23 января 2018

Вы можете попробовать Cinchoo ETL - библиотека с открытым исходным кодом для чтения и записи файлов CSV.

Несколько способов чтения файлов CSV

Id, Name
1, Tom
2, Mark

Вот как вы можете использовать эту библиотеку для чтения

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

Если у вас есть объект POCO, определенный для соответствия файлу CSV, как показано ниже

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

Вы можете проанализировать тот же файл, используя этот класс POCO, как показано ниже

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

Пожалуйста, ознакомьтесь со статьями CodeProject о том, как его использовать.

Отказ от ответственности: я автор этой библиотеки

1 голос
/ 27 октября 2017

Я поддерживаю проект с открытым исходным кодом под названием FlatFiles уже несколько лет. Он доступен для .NET Core и .NET 4.5.1.

В отличие от большинства альтернатив, он позволяет вам определять схему (аналогично тому, как сначала работает код EF) с предельной точностью, поэтому вы не будете постоянно бороться с проблемами преобразования. Вы можете сопоставить данные напрямую с вашими классами данных, а также поддерживается взаимодействие со старыми классами ADO.NET.

С точки зрения производительности, он настроен как один из самых быстрых парсеров для .NET с множеством опций для причудливых различий в формате. Также есть поддержка файлов фиксированной длины, если вам это нужно.

1 голос
/ 17 октября 2009

Похоже, что есть много проектов на CodeProject или CodePlex для разбора CSV. Вот еще один CSV Parser на CodePlex

http://commonlibrarynet.codeplex.com/

В этой библиотеке есть компоненты для синтаксического анализа CSV, INI-файла, а также для анализа командной строки. Пока это хорошо работает для меня. Единственное, у него нет CSV Writer.

1 голос
/ 10 сентября 2009

Это просто для разбора CSV. Чтобы отобразить его на веб-странице, достаточно просто взять список и отобразить его так, как вы хотите.

Примечание: В этом примере кода не обрабатывается ситуация, когда входная строка line содержит символы новой строки.

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 голос
/ 10 сентября 2009

Возможно, вас заинтересует библиотека Linq2Csv на CodeProject . Вам нужно проверить одну вещь: если вы читаете данные только тогда, когда это нужно, вам не понадобится много памяти при работе с большими файлами.

Что касается отображения данных в браузере, вы могли бы сделать много вещей, чтобы выполнить их, если бы вы были более конкретны в отношении ваших требований, ответ мог бы быть более конкретным, но вы могли бы сделать: 1. Используйте класс HttpListener для написания простого веб-сервера (вы можете найти множество примеров в сети для размещения мини-http-сервера).
2. Используйте Asp.Net или Asp.Net Mvc, создайте страницу, разместите ее с помощью IIS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...