Чтение файлов CSV с использованием C #

I ' Я пишу простое приложение для импорта и должен прочитать файл CSV, показать результат в DataGrid и показать поврежденные строки файла CSV в другой сетке. Например, покажите линии, которые короче 5 значений в другой сетке. Я пытаюсь сделать это так:

StreamReader sr = new StreamReader(FilePath);
importingData = new Account();
string line;
string[] row = new string [5];
while ((line = sr.ReadLine()) != null)
{
    row = line.Split(',');

    importingData.Add(new Transaction
    {
        Date = DateTime.Parse(row[0]),
        Reference = row[1],
        Description = row[2],
        Amount = decimal.Parse(row[3]),
        Category = (Category)Enum.Parse(typeof(Category), row[4])
    });
}

, но в этом случае очень сложно работать с массивами. Есть ли лучший способ разделить значения?

158
задан user1623521 25 July 2016 в 00:42
поделиться

4 ответа

Не изобретайте велосипед. Воспользуйтесь преимуществами того, что уже есть в .NET BCL.

  • добавить ссылку на Microsoft.VisualBasic (да, там написано VisualBasic, но он работает и на C # точно так же - помните, что в конце это всего лишь IL)
  • используйте Класс Microsoft.VisualBasic.FileIO.TextFieldParser для синтаксического анализа файла CSV

Вот пример кода:

using (TextFieldParser parser = new TextFieldParser(@"c:\temp\test.csv"))
{
    parser.TextFieldType = FieldType.Delimited;
    parser.SetDelimiters(",");
    while (!parser.EndOfData) 
    {
        //Processing row
        string[] fields = parser.ReadFields();
        foreach (string field in fields) 
        {
            //TODO: Process field
        }
    }
}

Он отлично работает для меня в моих проектах C #.

Вот еще несколько ссылок / информации:

345
ответ дан 23 November 2019 в 21:38
поделиться

По моему опыту, существует много разных форматов csv. Особенно то, как они обрабатывают экранирование кавычек и разделителей внутри поля.

Это варианты, с которыми я столкнулся:

  • кавычки цитируются и удваиваются (excel), т.е. 15 "-> field1," 15 "" ", field3
  • кавычки не меняются, если поле не указано для по другой причине. например, 15 "-> field1,15", кавычки fields3
  • экранируются символом \. То есть 15 "-> field1," 15 \ "", field3
  • кавычки не меняются вообще (это не всегда возможно правильно проанализировать)
  • разделитель заключен в кавычки (excel). т.е. a, b -> field1, "a, b", field3
  • разделитель экранирован символом \. т.е. a, b -> field1, a \, b, field3

Я пробовал многие существующие парсеры csv, но нет ни одного, который мог бы обрабатывать варианты, с которыми я столкнулся. Также трудно узнать из документации, какие варианты экранирования поддерживают парсеры. .

В своих проектах я теперь использую либо VB TextFieldParser, либо специальный разделитель.

36
ответ дан 23 November 2019 в 21:38
поделиться

CSV может быстро усложниться реальным .

Используйте что-нибудь надежное и проверенное:
FileHelpers: www.filehelpers.net

FileHelpers - это бесплатная и простая в использовании библиотека .NET для импорта / экспорта данных из записей фиксированной длины или записей с разделителями в файлы, строки или потоки.
6
ответ дан 23 November 2019 в 21:38
поделиться

Я использую это здесь:

http://www.codeproject.com/KB/database/GenericParser.aspx

В последний раз, когда я искал что-то подобное, я нашел это как ответ на этот вопрос.

4
ответ дан 23 November 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: