Подтвердить что ты не робот

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

Как читать файл CSV с помощью С#?

4b9b3361

Ответ 1

Выбор без использования сторонних компонентов заключается в использовании класса 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 */
}

Ответ 2

Вы можете использовать класс Microsoft.VisualBasic.FileIO.TextFieldParser в С#:

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;
}

Ответ 3

Вы можете попробовать 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

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

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

Ответ 5

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

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

Библиотека находится под лицензией 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");

Ответ 6

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

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

Ответ 7

Это просто для разбора 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;
    }
}

Ответ 8

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

http://commonlibrarynet.codeplex.com/

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

Ответ 9

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

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

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

Ответ 10

Вы можете попробовать 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 о том, как их использовать.

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

Ответ 11

Обычно я использую упрощенный подход, подобный этому:

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];
}