Есть ли в C # библиотеки для чтения / записи CSV? [закрыто]


111

Есть ли в C # библиотеки для чтения / записи CSV ?


68
Позволю себе не согласиться. Это определенно конструктивный вопрос и первый результат в Google для .net csv library. Свидетельства, хотя и анекдотические, в пользу моего утверждения заключаются в том, что за последние шесть лет этот вопрос рассматривался более 22000 раз.
shovavnik 03

5
правда сказал - первое попадание в Google
Робетто

Ответы:


107

Попробуйте CsvHelper . Он так же прост в использовании, как FastCsvReader, и позволяет писать. Раньше я был очень доволен FastCsvReader, но мне нужно было что-то, что также могло бы писать, и мне не нравился FileHelpers.

Чтение:

var csv = new CsvReader( stream );
var myCustomTypeList = csv.GetRecords<MyCustomType>();

Письмо:

var csv = new CsvWriter( stream );
csv.WriteRecords( myCustomTypeList );

Полное раскрытие информации: я являюсь автором этой библиотеки.


3
Спасибо, Джош. Я попробовал, и он был быстрым и эффективным с точки зрения памяти. Я думаю, что документацию можно было бы немного улучшить для начинающих пользователей, но этого определенно было достаточно.
Сэм,

Есть ли способ использовать эту библиотеку без настраиваемого типа, чтобы я мог просто перебирать сетку таблицы (настраиваемую) и записывать заголовок, а затем передавать каждое поле строки? Я просто ищу способ предотвратить ошибки в файлах (правильное экранирование и т. Д.).
u84six

Да. Вы можете использовать WriteField. Проверьте документацию здесь joshclose.github.io/CsvHelper
Джош Клоуз

1
@Zimano Неправда. Вы можете читать отдельные поля или даже просто получить массив строк для строки. Ознакомьтесь с документацией. joshclose.github.io/CsvHelper
Джош Клоуз

@JoshClose О, это приятно слышать, спасибо! Я только ознакомился с руководством по началу работы здесь: joshclose.github.io/CsvHelper/… и не включал мой вариант использования. Мне следовало поискать дальше, мои извинения. Однако на этой странице говорится, что использование какого-либо сопоставления является рекомендуемым способом использования CsvHelper. Может быть, там можно было бы предложить альтернативные стратегии чтения?
Между

21

Есть несколько вариантов прямо в самом фреймворке.

Один из самых простых - ссылаться на Microsoft.VisualBasic, а затем использовать TextFieldParser . Это полнофункциональный читатель CSV в основной структуре.

Еще одна хорошая альтернатива - использовать наборы данных для чтения файлов CSV .


6
Мне всегда было интересно, почему это было в сборке Microsoft.VisualBasic ... Считала ли MS, что разработчики C # не используют CSV?
Thomas Levesque

4
@Thomas: тем более, что многие разработчики C # съеживаются при мысли о включении сборки VisualBasic в свои проекты

2
Ага - там много хороших "вкусностей". Я думаю, это больше из-за того, что у VB есть некоторые языковые конструкции, которые изначально не рассматривались во фреймворке, но они никогда не смогли бы привлечь пользователей VB6 без их реализации. Пространства имен Devices и ApplicationServices содержат множество полезных вещей.
Рид Копси

20
@ Roboto, любой разработчик C #, который не любит ссылаться на Microsoft.VisualBasic в своем проекте, является невежественным снобом. Хуже того, они вообще не понимают .NET.
Ash

3
Еще одна жемчужина сборки VB - CopyDirectory: stackoverflow.com/questions/58744/…

17

У Себастьяна Лориона есть отличный CSVчитатель на CodeProject под названием A Fast CSV Reader . Вероятно, один из лучших для C # и бесплатный.

Что касается написания, просто используйте StreamWriter.

Вот шаблонный код для записи DataGridViewв файл:

private void exportDGVToCSV(string filename)
{
    if (dataGridView1.Columns.Count != 0) 
    {    
        using (Stream stream = File.OpenWrite(filename))
        {
            stream.SetLength(0);
            using (StreamWriter writer = new StreamWriter(stream))
            {
                // loop through each row of our DataGridView
                foreach (DataGridViewRow row in dataGridView1.Rows) 
                {
                    string line = string.Join(",", row.Cells.Select(x => $"{x}"));
                    writer.WriteLine(line);
                }

                writer.Flush();
            }
        };
    }
}

2
Это мой любимый. Отличная маленькая библиотека.
Alex

2
Написать CSV легко - просто используйте обычный метод вывода текста и разделите их запятыми. Вам действительно нужна только библиотека / пользовательский обработчик для чтения ...
Рид Копси,

10
@Reed: это не так уж просто, если вы хотите, чтобы запятые и кавычки правильно экранировались. Я даже не уверен, есть ли для этого стандартизация, но это очень распространено.
Стефан Штайнеггер

26
Написание CSV немного сложнее. Если данные, которые вы хотите выразить в файле CSV, содержат запятые или новые строки, вам необходимо заключить данные в кавычки. Если в новых данных, помеченных кавычками, есть кавычки, вам нужно экранировать кавычки с помощью двойных кавычек. Вы, конечно, можете сами запрограммировать эту логику, но было бы неплохо, если бы библиотека сделала это за вас.
Tinister

4
Стандартизация - RFC 4180. tools.ietf.org/html/rfc4180
Джош Клоуз

7

Да - хотя я предполагаю, что вы действительно спрашиваете подробности?

Попробуйте FileHelpers


Ну, я это сделал, но по какой-то странной причине FileHelpers сломался случайно. Кроме того, библиотека FileHelpers давно не разрабатывалась.
Эрик Ширбум,

1
FileHelpers сейчас активно разрабатываются, см. GitHub .
xmedeko

3

Их десятки.

http://www.filehelpers.net/ - один из самых распространенных.

Я должен сказать, что нахожу Filehelpers ограничивающим в некоторых сценариях и вместо этого использую The Fast CSV Reader . По моему опыту, если вы не знаете формат вашего CSV-файла или сопоставления импорта до времени выполнения - это лучшая библиотека для использования.


Мы также используем файловые помощники.
Tangurena

1
Я обнаружил, что FileHelpers неудобно настраивать. FastCsvReader было намного проще в использовании.
Джош Клоуз

+1 для FastCsvReader. Превосходное представление. Но это в основном читатель / парсер. Не писатель.
Mehdi LAMRANI
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.