символ переноса строки в файлах CSV

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Quantum18
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 16.03.2010 (Вт) 10:40

символ переноса строки в файлах CSV

Сообщение Quantum18 » 24.05.2010 (Пн) 9:52

Здравствуйте.

Такая проблема: Пытаюсь сочинить функцию чтения CSV файла с последующей заливкой содержимого в таблицу SQL и наткнулся на то, что в некоторых "ячейках" csv файла присутствует знак переноса строки - который вроде бы в данном формате должен означать конец строки... наверное не очень понятно. Ну короче формат csv - это "ячейки", разделенные знаком ";" (или ",") и "строки", обозначенные символом переносом строки, а тут символ переноса строки где попало встречается.

Например 20 колонок , а в 3-й колонке второй строки есть символ переноса строки. Соответственно работать с файлом становится не удобно: чтение его при помощи input или StreamReader.readline - приводит к прочтению строк кусками - до того самого переноса строки.

Можно написать конечно функцию так, чтобы она считала полученное количество ячеек и соображала - конец ли это строки или очередной "левый" значек переноса.

А вот по-проще вариантов нет? может модуль там какой для работы с CSV или может какие-то функции в VB есть, которые могут облегчить жизнь?

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: символ переноса строки в файлах CSV

Сообщение Dmitriy2003 » 24.05.2010 (Пн) 11:33

1 Introduction

The comma separated values format (CSV) has been used for exchanging and converting data between various spreadsheet programs for quite some time. Surprisingly, while this format is very common, it has never been formally documented. Additionally, while the IANA MIME registration tree includes a registration for "text/tab-separated-values" type, no MIME types have ever been registered with IANA for CSV. At the same time, various programs and operating systems have begun to use different MIME types for this format. This RFC documents the format of comma separated values (CSV) files and formally registers the "text/csv" MIME type for CSV in accordance with RFC 2048 [1].

2 Definition of the CSV Format

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:

1 Each record is located on a separate line, delimited by a line break (CRLF).

For example: писал(а): aaa,bbb,ccc CRLF
zzz,yyy,xxx CRLF


2 The last record in the file may or may not have an ending line break.

For example: писал(а):
aaa,bbb,ccc CRLF
zzz,yyy,xxx


3 There maybe an optional header line appearing as the first line

of the file with the same format as normal record lines. This header will contain names corresponding to the fields in the file and should contain the same number of fields as the records in the rest of the file (the presence or absence of the header line should be indicated via the optional "header" parameter of this MIME type).

For example: писал(а):field_name,field_name,field_name CRLF
aaa,bbb,ccc CRLF
zzz,yyy,xxx CRLF


RFC4180

Quantum18
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 16.03.2010 (Вт) 10:40

Re: символ переноса строки в файлах CSV

Сообщение Quantum18 » 24.05.2010 (Пн) 11:39

Dmitry2003 - я так понимаю, что суть всего этого текста в том, что наличие таких символом не в том месте - это не по формату. Так?

Но проблема в том, что таким образом выгружает интернет магазин а я должен обработать. Я не имею возможности редактировать выгрузку на стороне интернет магазина. К тому же Excel съедает все в таком виде и не парится.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: символ переноса строки в файлах CSV

Сообщение Dmitriy2003 » 24.05.2010 (Пн) 11:43

Quantum18 писал(а):Так?

Yes.

Прикрепи csv фаил. для тестов.

Quantum18
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 16.03.2010 (Вт) 10:40

Re: символ переноса строки в файлах CSV

Сообщение Quantum18 » 24.05.2010 (Пн) 12:08

там получается что-то вроде:

field_name,field_name,field_name CRLF
aaa,bCRLFbb,ccc CRLF
zzz,yyy,xCRLFxx CRLF

прикрепить csv или txt не удается - форум пишет, что это запрещено.
Так что пришлось выложить файл:
http://www.climateng.ru/export_file.csv

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: символ переноса строки в файлах CSV

Сообщение iGrok » 24.05.2010 (Пн) 12:37

Значение ячейки может быть заключено в кавычки - "
Тогда внутри может быть вообще всё, что угодно, и это должно игнорироваться до тех пор, пока не встретишь парную кавычку.
В данном случае, наборы CRLF<br />CRLF, как и просто CRLF находятся внутри строк, заключённых в кавычки.
label:
cli
jmp label

Quantum18
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 16.03.2010 (Вт) 10:40

Re: символ переноса строки в файлах CSV

Сообщение Quantum18 » 24.05.2010 (Пн) 13:01

iGrok писал(а):Значение ячейки может быть заключено в кавычки - "
Тогда внутри может быть вообще всё, что угодно, и это должно игнорироваться до тех пор, пока не встретишь парную кавычку.
В данном случае, наборы CRLF<br />CRLF, как и просто CRLF находятся внутри строк, заключённых в кавычки.


мда...

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

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: символ переноса строки в файлах CSV

Сообщение iGrok » 24.05.2010 (Пн) 13:10

Как и раньше, построчно. Потом разбирать строку на ячейки. Если в одной из ячеек встречается кавычка - искать парную. Если не найдена - прибавлять следующую строку к этой и искать дальше.
label:
cli
jmp label

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: символ переноса строки в файлах CSV

Сообщение Dmitriy2003 » 24.05.2010 (Пн) 13:13

Quantum18 писал(а):Спасибо за ценную информацию, а как же теперь это легче считывать, чтобы не пришлось все равно считать ячейки или по одному символу ловить кавычки и делать многозначительные выводы?


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

Прикол:
Код: Выделить всё
...;"Полный комплект прокладок ЦПГ Polini Sport 70.CRLF";...

тяжело понять в чем смысл сего... :D

Quantum18
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 16.03.2010 (Вт) 10:40

Re: символ переноса строки в файлах CSV

Сообщение Quantum18 » 24.05.2010 (Пн) 13:19

Спасибо ребята - все понял.

Polini - это производитель ни то скутеров ни то запчастей к ним - так что это прокладки для двигателя или что-то в этом духе.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: символ переноса строки в файлах CSV

Сообщение Dmitriy2003 » 24.05.2010 (Пн) 13:23

Quantum18 писал(а):Polini - это производитель ни то скутеров ни то запчастей к ним - так что это прокладки для двигателя или что-то в этом духе.

Это как раз не существенно - заметь где стоит CRLF :lol: ,
и как было-бы тебе проще жить если-бы создатель сего продумал все до конца, ведь в некоторых строках он не переносит данные в ячейках :wink:

Quantum18
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 16.03.2010 (Вт) 10:40

Re: символ переноса строки в файлах CSV

Сообщение Quantum18 » 24.05.2010 (Пн) 13:43

Dmitriy2003 писал(а):
Quantum18 писал(а):Polini - это производитель ни то скутеров ни то запчастей к ним - так что это прокладки для двигателя или что-то в этом духе.

Это как раз не существенно - заметь где стоит CRLF :lol: ,
и как было-бы тебе проще жить если-бы создатель сего продумал все до конца, ведь в некоторых строках он не переносит данные в ячейках :wink:


да - разработчик негодяй (судя по всему - мексиканский)

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: символ переноса строки в файлах CSV

Сообщение iGrok » 24.05.2010 (Пн) 13:50

Quantum18 писал(а):да - разработчик негодяй (судя по всему - мексиканский)

Нет, это явно какой-то вонючий пуэрто-риканец!© :mrgreen:
label:
cli
jmp label

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: символ переноса строки в файлах CSV

Сообщение Dmitriy2003 » 24.05.2010 (Пн) 20:45

решил тут поиграть с csv - :mrgreen:
написал наикривейшый парсер - 55 мс. на твой фаил. (правда кое что там подправил). :alien:
Из любопытства, если будешь свой писать - выложи потом для теста на скорость. (тока если он принципиально другой). :D
Вложения
wfa1.rar
VC#2008.NET.FW.2.0.SRC
(36.58 Кб) Скачиваний: 190

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: символ переноса строки в файлах CSV

Сообщение Joo » 25.05.2010 (Вт) 4:31

Решение: Открыть его как БД и не выдумывать велосипед.
Строка подключения:
Код: Выделить всё
Dim ConnString As String = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + CSVFilesFolder + "; Extensions=asc,csv,tab,txt; Persist Security Info=False"

Запрос:
Код: Выделить всё
Dim SQL As String = "select * from [" + CSCFileName + "]"

Дальше сам.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: символ переноса строки в файлах CSV

Сообщение Dmitriy2003 » 25.05.2010 (Вт) 11:42

Joo писал(а):Решение: Открыть его как БД и не выдумывать велосипед.

Хм.., увы не прокатывает - разбивает мой фаил тока по CRLF, сразу загибается на фале с unicod кодировкой, что то не так с велосипедом ?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: символ переноса строки в файлах CSV

Сообщение iGrok » 25.05.2010 (Вт) 13:27

Dmitriy2003 писал(а):
Joo писал(а):Решение: Открыть его как БД и не выдумывать велосипед.

Хм.., увы не прокатывает - разбивает мой фаил тока по CRLF, сразу загибается на фале с unicod кодировкой, что то не так с велосипедом ?

Да нет. Там надо ещё описание формата в строку подключения добавлять при этом. Мне сейчас влом искать, как это делается..
label:
cli
jmp label

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: символ переноса строки в файлах CSV

Сообщение Joo » 26.05.2010 (Ср) 8:22

iGrok писал(а):
Dmitriy2003 писал(а):
Joo писал(а):Решение: Открыть его как БД и не выдумывать велосипед.

Хм.., увы не прокатывает - разбивает мой фаил тока по CRLF, сразу загибается на фале с unicod кодировкой, что то не так с велосипедом ?

Да нет. Там надо ещё описание формата в строку подключения добавлять при этом. Мне сейчас влом искать, как это делается..


Да iGrok прав, там есть еще дополнительные опции, а это я привел минимальный вариант. Гугл тебе в помощь, это таки луше чем свое писать
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: символ переноса строки в файлах CSV

Сообщение Dmitriy2003 » 26.05.2010 (Ср) 11:14

Joo писал(а):Да iGrok прав, там есть еще дополнительные опции, а это я привел минимальный вариант. Гугл тебе в помощь, это таки луше чем свое писать

И откуда такая уверенность :D

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: символ переноса строки в файлах CSV

Сообщение Joo » 26.05.2010 (Ср) 13:48

Dmitriy2003 писал(а):
Joo писал(а):Да iGrok прав, там есть еще дополнительные опции, а это я привел минимальный вариант. Гугл тебе в помощь, это таки луше чем свое писать

И откуда такая уверенность :D

Уверенность в чем?
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: символ переноса строки в файлах CSV

Сообщение Dmitriy2003 » 26.05.2010 (Ср) 13:54

Joo писал(а):Уверенность в чем?

Joo писал(а):это таки луше чем свое писать

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: символ переноса строки в файлах CSV

Сообщение iGrok » 26.05.2010 (Ср) 14:13

Dmitriy2003 писал(а):
Joo писал(а):Уверенность в чем?

Joo писал(а):это таки луше чем свое писать

Ну всё-таки это даёт возможность использовать всю мощь SQL...
Сам ты напишешь что-то с подобными возможностями?

Тут есть ещё два момента, которые объединяет высказывание Великого Китайского Мудреца Конфуцийя: "А на хуа?".

С одной стороны, если нужно просто импортировать инфу, то зачем нужен SQL?
С другой стороны, если нужно просто импортировать инфу, зачем изобретать велосипед, если есть готовое решение с SQL?
label:
cli
jmp label

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: символ переноса строки в файлах CSV

Сообщение Dmitriy2003 » 26.05.2010 (Ср) 14:25

iGrok писал(а):С другой стороны, если нужно просто импортировать инфу, зачем изобретать велосипед, если есть готовое решение с SQL?

iGrok писал(а):Тут есть ещё два момента, которые объединяет высказывание Великого Китайского Мудреца Конфуцийя: "А на хуа?".

Хм.., я ваше готовое решение пытался на практике применить - Win7 x64 Rus - VS2008 C# - NET FW 2.0 - результат -> трахаться можно до усрачки оно се равно не работает корректно, тока в простых случаях типа - a,b,c, в ansi - кодировке. Что может у меня с ос что то не так ? :)

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: символ переноса строки в файлах CSV

Сообщение iGrok » 26.05.2010 (Ср) 15:54

Dmitriy2003 писал(а):Что может у меня с ос что то не так ? :)

0_o

connstring:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source="путь_к_файлу";Extended Properties="text;HDR=Yes;FMT=Delimited(;)"

Ааа... x64. М.б. в этом дело.
http://www.connectionstrings.com/Articl ... vironments
Вложения
csvproc.zip
Файл, сорцы, экзешник
(39.33 Кб) Скачиваний: 159
csvproc.PNG
Скрин
csvproc.PNG (63.46 Кб) Просмотров: 11072
label:
cli
jmp label

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: символ переноса строки в файлах CSV

Сообщение Dmitriy2003 » 26.05.2010 (Ср) 16:57

iGrok писал(а):Provider=Microsoft.Jet.OLEDB.4.0;Data Source="путь_к_файлу";Extended Properties="text;HDR=Yes;FMT=Delimited(;)"

речь ведь о другом была
Joo писал(а):Dim ConnString As String = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + CSVFilesFolder + "; Extensions=asc,csv,tab,txt; Persist Security Info=False"


Так-вот, э... не полит-корректно на vb6,
Внял твоим советам со схемой, удалось заставить подключиться к источнику из кода, а вот с датасетом во время разработки облом, все время какую-то ошибку выдает "[HY1001]" - что-бы это значило ? и как отучить приложение от схемы или может есть способ передать схему в строке соединения ? или еще как ?
Вложения
wfa2.rar
VC2008-C#-NET.FW.2.0-SRC+Binary
CSV via Microsoft Text Driver (ODBC)
(77.46 Кб) Скачиваний: 130

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: символ переноса строки в файлах CSV

Сообщение iGrok » 26.05.2010 (Ср) 17:14

Ну. Как заставить работать Text Driver я без понятия. )
Я просто сам уже не помнил строку подключения, в свою нашёл за три минуты на ConnectionStrings.
От схемы отучить, кажись, нельзя, но в моём варианте схема не используется.

А насчёт политкорректности.. Ну нету у меня VB.NET =)

С ado.net не прокатывает такая строка подключения, как у меня?

UPD: А. Всё. Понял. Юникод читать не хочет.
С юникодом вопрос решается только созданием schema.ini. В принципе, когда я над чем-то таким работал, я перед запросом проверял наличие и корректность записи для нужного мне файла в schema.ini, и если что пересоздавал его.
Последний раз редактировалось iGrok 26.05.2010 (Ср) 18:11, всего редактировалось 1 раз.
label:
cli
jmp label

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: символ переноса строки в файлах CSV

Сообщение Dmitriy2003 » 26.05.2010 (Ср) 18:07

iGrok писал(а):С ado.net не прокатывает такая строка подключения, как у меня?

Файло, собств. на лежит месте :evil: , что за баги :twisted:
Вложения
OleDB.Exp.png
OleDB.Exp.png (7.73 Кб) Просмотров: 11066

Lobo
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 08.01.2004 (Чт) 16:49
Откуда: Таллинн, Эстония

Re: символ переноса строки в файлах CSV

Сообщение Lobo » 01.06.2010 (Вт) 10:59

И после всего этого вы говорите, что использовать файл как базу проще, чем написать свой парсер?! :mrgreen:

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: символ переноса строки в файлах CSV

Сообщение iGrok » 01.06.2010 (Вт) 13:04

Lobo писал(а):И после всего этого вы говорите, что использовать файл как базу проще, чем написать свой парсер?! :mrgreen:

Ну, например, у меня под vb6 всё заработало вообще без каких-либо проблем.
Да и под .net тоже всё работает.
Это если файл - не в юникоде. Если в unicode - не работает ни там ни там. Нужна схема. Которую очень просто сгенерить. Эксель, кстати, юникодные csv тоже без доп. настроек открыть не может.

Да и часто ли попадаются csv в юникоде? Я вот первый раз видел такой в примере, данном Дмитрием..
label:
cli
jmp label


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList