powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Парсер CSV
17 сообщений из 17, страница 1 из 1
Парсер CSV
    #39120195
cherrex_Den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!
Задача: написать модуль работы с CSV. Т.е. есть DataTable надо организовать функции импорта и экспорта в/из CSV.
Пример файла выглядит так (Разделитель запятая)

"a
b
c","x
y
z"
test;test,xxx;xxx
"test2,test2","xxx2,xxx2"
"test3""test3","xxx3""xxx3"
123,123


таблица


Поискав в инете, не нашел достойного примера. Все что то забывают, то двойные кавычки, то перенос строки.

Может у кого-то есть готовый паттерн, чтоб велосипед не изобретать.

Заранее спасибо!!!
...
Рейтинг: 0 / 0
Парсер CSV
    #39120341
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cherrex_Den,

А вы уверены, что это csv?
...
Рейтинг: 0 / 0
Парсер CSV
    #39120359
cherrex_Den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,

Да, все по по правилам.

https://ru.wikipedia.org/wiki/CSV В частности в локалях, где десятичным разделителем является запятая, в качестве табличного разделителя, как правило, используется точка с запятой. Значения, содержащие зарезервированные символы (двойная кавычка, запятая, точка с запятой, новая строка ) обрамляются двойными кавычками (");

Просто пример демонстрирует все "заковыристые" варианты.
...
Рейтинг: 0 / 0
Парсер CSV
    #39120361
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в CVS перенос строки, это как правило разделить записей.
Если у автора перенос строки может быть в значении, значит нужно определить чем будет являться разделитель записей...
...
Рейтинг: 0 / 0
Парсер CSV
    #39120377
cherrex_Den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes значит нужно определить чем будет являться разделитель записей...

Нет, если перенос строки в значении, то он обрамляется двойными кавычками, а сепаратор строк так и остается, переносом строки.
...
Рейтинг: 0 / 0
Парсер CSV
    #39120382
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cherrex_DenArm79,

Да, все по по правилам.

https://ru.wikipedia.org/wiki/CSV В частности в локалях, где десятичным разделителем является запятая, в качестве табличного разделителя, как правило, используется точка с запятой. Значения, содержащие зарезервированные символы (двойная кавычка, запятая, точка с запятой, новая строка ) обрамляются двойными кавычками (");

Просто пример демонстрирует все "заковыристые" варианты.

Этот пример некорректный. CSV - это плоские данные, соответственно, количество полей должно быть одинаково в каждой строке.

Во-вторых, в CSV не бывает такого, что в одной строке разделителем является запятая, а во второй - символ табуляции.

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

В четвертых, если кавычки открываются, то они должны и закрываться.
...
Рейтинг: 0 / 0
Парсер CSV
    #39120386
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и в пятых, что это за CSV, в котором перенос строк является значением?
...
Рейтинг: 0 / 0
Парсер CSV
    #39120387
cherrex_Den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cherrex_Den то он обрамляется двойными кавычками
Описался, все значение обрамляется в двойные кавычки.
...
Рейтинг: 0 / 0
Парсер CSV
    #39120397
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Ну и в пятых, что это за CSV, в котором перенос строк является значением?
https://www.ietf.org/rfc/rfc4180.txt
...
Рейтинг: 0 / 0
Парсер CSV
    #39120426
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

постоянно по долгу службы приходится работать с этими богомерзкими csv файлами.
1000чи их, даже в тупом Excel для сохранения 100500 вариантов, а для открытия целый визард который определяет, что да как.
так что эти стандарты вилами по воде писаны :)
...
Рейтинг: 0 / 0
Парсер CSV
    #39120484
cherrex_Den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79Этот пример некорректный. CSV - это плоские данные, соответственно, количество полей должно быть одинаково в каждой строке.
А у меня одинаково. смотрите картинку(скрин) с Excel.

Arm79Во-вторых, в CSV не бывает такого, что в одной строке разделителем является запятая, а во второй - символ табуляции.
Нет в моем примере табуляции!

Arm79В третьих, вариаций CSV может быть много, поэтому я бы не закладывался на константу " для экранирования значений.
Есть стандарт, ссылку давал выше. Вот по нему и надо сделать решение. Excel как раз все правильно понимает (см. скрин)

Arm79В четвертых, если кавычки открываются, то они должны и закрываться.
Это пример! Если я добавлю закрывающую кавычку, от этого что-то измениться?

Arm79Ну и в пятых, что это за CSV, в котором перенос строк является значением?
"Значение" - это данные. Почему не может быть текстовых значений с переносом строки?
Да и стандарт это позволяет.

Если бы мне надо было распарсить простой CSV с разделителем - запятая и с строко-разделителем - "перенос строки", я бы это бы сделал за 2-е минуты 3-мя командами.

Здесь вся штука в том чтоб обработать "зарезервированные символы" по стандарту.
...
Рейтинг: 0 / 0
Парсер CSV
    #39120490
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилArm79Ну и в пятых, что это за CSV, в котором перенос строк является значением?
https://www.ietf.org/rfc/rfc4180.txt

While there are various specifications and implementations for the
CSV format (for ex. [4], [5], [6] and [7]), there is no formal
specification in existence, which allows for a wide variety of
interpretations of CSV files. This section documents the format that
seems to be followed by most implementations:
...
Рейтинг: 0 / 0
Парсер CSV
    #39120515
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

сделай для себя формальную спецификацию того, что готов принимать на входе (да хоть в БНФ)
...
Рейтинг: 0 / 0
Парсер CSV
    #39120521
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилArm79,

сделай для себя формальную спецификацию того, что готов принимать на входе (да хоть в БНФ)

А мне то это зачем? ))) Я пользуюсь мастером импорта-экспорта из поставки MS SQL и доволен. Это ТС нужен какой то велосипед.

Если ему нравится Excel, почему бы ему его и не использовать?
...
Рейтинг: 0 / 0
Парсер CSV
    #39120530
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Excel правильно не понимает. По крайней мере русскоязычный. Сохрани свой пример в файл test.csv и щелкни по нему мышью. Будет вовсе не так как на скриншотах.

Потому что какого-то умника угораздило для русских рег.настроек сделать запятую разделителем целой и дробной частей чисел.
В итоге в CSV стало невозможно использовать запятую и в русском CSV разделитель точка с запятой.

Вот из-за этой мелкой фигни столько гимора с разбором данных из текстовых файлов. Не только CSV

PS Сам напиши. Там конечным автоматом все делается. Тут 17389367 на С делал, можешь за основу взять. Там почти все что тебе надо, только перевод строки считается концом строки.
...
Рейтинг: 0 / 0
Парсер CSV
    #39120558
Andrey Mironov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cherrex_Den,

CsvHelper справляется и с кавычками, и с переносами строк. В FAQ есть пример работы с DataTable.
...
Рейтинг: 0 / 0
Парсер CSV
    #39122554
cherrex_Den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел очень короткий способ. Парсит все!!!

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
using Microsoft.VisualBasic.FileIO;
//----------
using (TextFieldParser parser = new TextFieldParser(Stream))
  {
    parser.TextFieldType = FieldType.Delimited;
    parser.SetDelimiters(",");

    while (!parser.EndOfData)
    {
      string[] fields = parser.ReadFields();
      foreach (string field in fields)
      {
         //Work...
      }
    }
  }
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Парсер CSV
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]