Чи є в C # бібліотеки читачів / письменників CSV? [зачинено]


111

Чи є в C # бібліотеки читачів / письменників CSV ?


68
Дозволю собі не погодитися. Це, безумовно, конструктивне питання і перший результат у Google для .net csv library. На мою думку, хоч і невідомі, що це питання було розглянуто більше 22000 разів за останні шість років.
шовавник

5
вірно сказано - перший удар на Google
Robetto

Відповіді:


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
Josh Закрити

1
@Zimano Неправда. Ви можете прочитати окремі поля або навіть просто отримати рядковий рядок для рядка. Ознайомтеся з документацією. joshclose.github.io/CsvHelper
Josh Close

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

21

Існує пара варіантів, прямо в самих рамках.

Одним з найпростіших є посилання на Microsoft.VisualBasic, а потім використовувати TextFieldParser . Це повністю функціональний зчитувач CSV в основних рамках.

Ще однією хорошою альтернативою є використання наборів даних для читання файлів CSV .


6
Мені завжди було цікаво, чому це було в зборі Microsoft.VisualBasic ... Чи думали MS, що розробники C # не використовують CSV?
Томас Левеск

4
@Thomas: тим більше, що багато розробників C # мчаться над думкою про включення VisualBasic в свої проекти

2
Так - там є багато приємних "смакоти". Я думаю, що це більше, тому що VB має деякі мовні конструкції, які насправді не розглядалися в рамках, але вони ніколи не змогли б залучити користувачів VB6, не застосовуючи їх. У просторах імен Devices and ApplicationServices є всілякі корисні речі.
Рід Копсей

20
@ Roboto, будь-який розробник C #, котрий переслідує посилання на Microsoft.VisualBasic у своєму проекті - це невідомий мовний сноб. Ще гірше, що вони зовсім не розуміють .NET.
Еш

3
Інший VB збірка дорогоцінний камінь CopyDirectory: stackoverflow.com/questions/58744 / ...

17

У Себастьєна Лоріона є чудовий CSVчитач CodeProject під назвою 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
Це мій улюблений. Велика маленька бібліотека.
Олексій

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

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

26
Написання CSV трохи складніше, ніж це. Якщо дані, які ви хочете виразити у файлі CSV, містять коми або нові рядки, вам потрібно оточити дані лапками. Якщо в нещодавно даних, що позначені цитатами, є лапки, вам слід уникнути лапки з подвійними лапками. Ви, звичайно, можете самі кодувати цю логіку, але було б непогано, щоб бібліотека зробила це за вас.
Тиністер

4
Стандартизація - RFC 4180. tools.ietf.org/html/rfc4180
Josh Close

7

Так - хоча я припускаю, що ви насправді просите конкретні дані?

Спробуйте FileHelpers


Добре, що я, але з якихось дивних причин FileHelpers зламався випадковим чином. Крім того, бібліотека FileHelpers вже давно не розробляється.
Erik Schierboom

1
FileHelpers зараз активно розвиваються, дивіться GitHub .
xmedeko

3

Є десятки.

http://www.filehelpers.net/ - одна з найпоширеніших.

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


Ми також використовуємо файлові помічники.
Тангурена

1
Я виявив, що FileHelpers неприємно налаштовувати. FastCsvReader було набагато простіше у використанні.
Josh Close

+1 для FastCsvReader. Відмінна продуктивність. Але це в основному читач / аналізатор. Не письменник.
Мехді ЛАМРАНІ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.