КАРТА САЙТА
Sibnet.ru
Sibnet.ru

Sibnet.ru — это информационно-развлекательный интернет-проект, ориентированный на широкий круг Сибирского региона.
По данным Rambler Top100, Sibnet.ru является самым популярным порталом в Сибири.

Контакты:
АО "Ринет"
ОГРН 1025402475856
г. Новосибирск, ул. Якушева, д. 37, 3 этаж
отдел рекламы:
(383) 347-10-50, 347-06-78, 347-22-11, 347-03-97

Редакция: (383) 347-86-84

Техподдержка: (383) 347-22-44
help.sibnet.ru

Внимание! Теперь для входа на форум необходимо вводить единый пароль регистрации сервисов sibnet.ru!

Здравствуйте, гость ( Вход | Регистрация )



 
Ответить в эту темуОткрыть новую тему
> Преобразование Xls (xlsx) в Csv
broun
сообщение 20.5.2018, 13:44
Сообщение #1


Поддерживает разговор
Group Icon


Группа: Пользователи
Сообщений: 118
Регистрация: 18.4.2013
Пользователь №: 484 176



Репутация:   0  


Добрый день!

1. Есть файл Excel:
Прикрепленный файл  1.rar ( 9.5 килобайт ) Кол-во скачиваний: 6

» Спойлер (нажмите, чтобы прочесть) «

Прикрепленное изображение

2. Пересохраняю его в формате csv:
» Спойлер (нажмите, чтобы прочесть) «

Прикрепленное изображение

3. Получаем:
Прикрепленный файл  2.rar ( 719 байт ) Кол-во скачиваний: 4

» Спойлер (нажмите, чтобы прочесть) «

Прикрепленное изображение

Что не так?
1. Сохранял я с разделителями - запятые, а тут ими вообще не пахнет.
2. Возьмём с сайта администрации города Томска файл:
Прикрепленный файл  data_20180411_structure_20180411.rar ( 979 байт ) Кол-во скачиваний: 4

» Спойлер (нажмите, чтобы прочесть) «


3. Откроем его с помощь Excel:
» Спойлер (нажмите, чтобы прочесть) «

Прикрепленное изображение
- кодировка - понятно
- но расположение данных - оно построчное и границы - это запятые.
4. Если взять этот файл и открыть его с помощью:
» Спойлер (нажмите, чтобы прочесть) «

Прикрепленное изображение

5. Получим вполне читабельную таблицу:
» Спойлер (нажмите, чтобы прочесть) «

Прикрепленное изображение

Т.е. определённый скрипт по известному алгоритму вполне успешно прочитает этот файл, возьмет данные и импортирует куда-нибудь.

6.А в моем случае:
» Спойлер (нажмите, чтобы прочесть) «

Прикрепленное изображение

Что-то невразумительное.

При этом, для примера здесь, я создал специальную таблицу с элементарным наполнением.
Оригинал, который я здесь, увы, не привожу - он в некоторых ячейках соответствующих строк и столбцов, содержит текст, который имеет естественные запятые (т.е. по тексту требуются).
После преобразования в csv он остается таблицей, разве только что столбцы приобретают фиксированную ширину, а после обратного преобразования получается ПОЛНАЯ каша.



Вопрос:
Что не так в моей консерватории?

Спасибо.

P.S.
Я догадываюсь, что в Томске, скорее всего, используют специализированное ПО, но:
1. Можно ли использовать Excel для этих целей?
2. Значит ли это, что исходную таблицу нужно заполнять специализированным образом, а не просто как таблицу в Excel? Т.е. грубо говоря, должен ли пользователь изначально формировать по принципу:
fid1,fld2
Вася, Маша

?
Тогда это будет невыполнимо, т.к. пользователи откажутся это делать и будут правы.

Сообщение отредактировал broun - 20.5.2018, 14:17
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
broun
сообщение 20.5.2018, 14:01
Сообщение #2


Поддерживает разговор
Group Icon


Группа: Пользователи
Сообщений: 118
Регистрация: 18.4.2013
Пользователь №: 484 176



Репутация:   0  


Но даже если (эксперимента ради) я напишу исходные данные вот в таком виде:
» Спойлер (нажмите, чтобы прочесть) «

Прикрепленное изображение
Он в csv сохранит данные в оригинальном виде, но после обратного преобразования опять получится что-то не совсем правильное - какие-то точки с запятой:
» Спойлер (нажмите, чтобы прочесть) «

Прикрепленное изображение

В любом случае, ТАК писать таблицу в Excel пользователи не должны.

Сообщение отредактировал broun - 20.5.2018, 14:02
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
KoМат
сообщение 20.5.2018, 15:45
Сообщение #3


Поддерживает разговор
Group Icon


Группа: Пользователи
Сообщений: 145
Регистрация: 1.11.2017
Пользователь №: 558 111



Репутация:   77  


Я заменил разделитель элементов с ; на , в :
» Спойлер (нажмите, чтобы прочесть) «

при этом еще пришлось поменять разделитель целой и дробной части там же с , на . , чтобы запятая не повторялась в качестве разделителя.
После этого Excel стал сохранять с запятой в качестве разделителя.


» Спасибо сказали: «
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
broun
сообщение 20.5.2018, 19:45
Сообщение #4


Поддерживает разговор
Group Icon


Группа: Пользователи
Сообщений: 118
Регистрация: 18.4.2013
Пользователь №: 484 176



Репутация:   0  


Цитата(KoМат @ 20.5.2018, 15:45) *

Я заменил разделитель элементов с ; на , в :
» Спойлер (нажмите, чтобы прочесть) «

при этом еще пришлось поменять разделитель целой и дробной части там же с , на . , чтобы запятая не повторялась в качестве разделителя.
После этого Excel стал сохранять с запятой в качестве разделителя.

Спасибо.
Это помогло при обратном преобразовании (сложной таблицы, с запятыми в тексте - не из примера) выстроить текст в ячейках нормально. super.gif

Но тут вопрос получается вот в чем:
Если брать пример с сайта адм Томска, то там принцип записи другой: нет как таковой таблицы - все в виде текстовой строки.
Замена типов разделителей (из Вашего примера) никак не повлияла на преобразование в читабельный вид.
А в моем случае получается какая-то зависимость от типов разделителей, заданных в системе. Это смущает.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
shouhei
сообщение 20.5.2018, 20:48
Сообщение #5


Himmelsstürmer
Group Icon


Группа: Супермодераторы
Сообщений: 33 325
Регистрация: 2.4.2008
Из: Caught somewhere in time
Пользователь №: 27 739



Репутация:   1413  


Точка с запятой — нормальный, конвенциональный разделитель для csv. Если сильно хочется, csv представляет собой обыкновенный текстовый файл, разделитель можно поменять на любой другой в любом текстовом редакторе, том же блокноте.

То, что при импорте csv в MS Excell или даже Open/Libre Office calc теряется форматирование ячеек — это абсолютно нормальный и правильный процесс, потому что в csv такая информация просто не хранится.

Самый простой выход — как раз использовать мастер импорта в Excel.

Что касается типов разделителей дробной и целой части. Да, в системах, где разделитель дробной части числа — запятая, может выйти такой казус. Региональные стандарты — они суровы. Вот как раз поэтому, выгоднее всего в качестве разделителя полей использовать точку с запятой. Избегаешь путаницы, сохраняешь нормальные значения ячеек.

И пример с сайта администрации — там обыкновенный csv. Самый обыкновенный. Какрй и должен формироваться при сохранении табличных данных в csv


» Спасибо сказали: «
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
broun
сообщение 20.5.2018, 21:46
Сообщение #6


Поддерживает разговор
Group Icon


Группа: Пользователи
Сообщений: 118
Регистрация: 18.4.2013
Пользователь №: 484 176



Репутация:   0  


Цитата(shouhei @ 20.5.2018, 20:48) *

Точка с запятой — нормальный, конвенциональный разделитель для csv. Если сильно хочется, csv представляет собой обыкновенный текстовый файл, разделитель можно поменять на любой другой в любом текстовом редакторе, том же блокноте.

То, что при импорте csv в MS Excell или даже Open/Libre Office calc теряется форматирование ячеек — это абсолютно нормальный и правильный процесс, потому что в csv такая информация просто не хранится.

Самый простой выход — как раз использовать мастер импорта в Excel.

Что касается типов разделителей дробной и целой части. Да, в системах, где разделитель дробной части числа — запятая, может выйти такой казус. Региональные стандарты — они суровы. Вот как раз поэтому, выгоднее всего в качестве разделителя полей использовать точку с запятой. Избегаешь путаницы, сохраняешь нормальные значения ячеек.

И пример с сайта администрации — там обыкновенный csv. Самый обыкновенный. Какрй и должен формироваться при сохранении табличных данных в csv

Проэксперементирвал.
Как я понял, что в сложных текстах, где есть запятые, тогда разделителем лучше использовать точку с запятой, а чтобы запятую использовать, то вариант тот, который KoМат.
---------------------

И все таки немного не понятно вот что:
Очевидно, что в Администрации Томска используют специализированное ПО, а непросто экселем преобразовывают. Но на выходе получается не табличная запись, а построчно. И такую штуку я видел не только в Томске (это просто пример).
В чём тогда разница, с точки зрения считывания данных их файлов для использования их, в каом-нибудь по с объектами типа "Grid"?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
shouhei
сообщение 20.5.2018, 22:22
Сообщение #7


Himmelsstürmer
Group Icon


Группа: Супермодераторы
Сообщений: 33 325
Регистрация: 2.4.2008
Из: Caught somewhere in time
Пользователь №: 27 739



Репутация:   1413  


Цитата(broun @ 20.5.2018, 21:46) *

Как я понял, что в сложных текстах, где есть запятые, тогда разделителем лучше использовать точку с запятой, а чтобы запятую использовать, то вариант тот, который KoМат.


Неправильно. Если запятая внутри кавычек, например, как в том же файле с сайта томской администрации:
Код

[shouhei:~]$ wget -q -O /tmp/data.csv http://admin.tomsk.ru/opendata/7021023925-DOLG/data-20180411-structure-20180411.csv && cat /tmp/data.csv && rm /tmp/data.csv
fld1,fld2,fld3
"1. Кредиты коммерческих банков","1 992 450","703 000"
"2. Займы, осуществляемые путем выпуска ценных бумаг","1 557 727","1 585 726"
"3. Бюджетные кредиты от других бюджетов бюджетной системы Российской Федерации","0","622 000"
"4. Муниципальные гарантии","0","0"
"ИТОГО:","3 550 177","2 910 726"

То есть всё — вопрос форматирования. Всё внутри кавычек, ограниченное разделителями — это одно поле.

Цитата(broun @ 20.5.2018, 21:46) *

И все таки немного не понятно вот что:
Очевидно, что в Администрации Томска используют специализированное ПО, а непросто экселем преобразовывают.


Даже если используется специализированое ПО(в чём лично я сомневаюсь, ибо это максимум небольшой скрипт на любом скриптовом языке в две-три строчки кода), файл получается самый обычный csv, который точно так же легко и приятно обрабатывается любым табличным процессором или СУБД.

Я не могу понять, что надо с ними делать то?

Цитата(broun @ 20.5.2018, 21:46) *

Но на выходе получается не табличная запись, а построчно.


Открой любой файл csv в блокноте — получишь набор строчек. Сюрприз. Таблицу из этих строк строит сам табличный процессор, ориентируясь по разделителям.

Цитата(broun @ 20.5.2018, 21:46) *

В чём тогда разница, с точки зрения считывания данных их файлов для использования их, в каом-нибудь по с объектами типа "Grid"?


Никакой. Как ты напишешь их парсер, так и будут данные строится. Проблема в определении типа разделителя и в том, что разделитель внутри строковых полей(ограниченых кавычками) — не считается за разделитель. Ну и само собой надо правильно определить кодировку файла.

Повторюсь ещё раз: csv — это обычный текст. Как txt. В случае с файлом, скачанным с сайта томской администрации — MS Excel не распознаёт кодировку файла, отличную от windows-1251, от этого у тебя и получились строчки.


» Спасибо сказали: «
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
broun
сообщение 21.5.2018, 0:03
Сообщение #8


Поддерживает разговор
Group Icon


Группа: Пользователи
Сообщений: 118
Регистрация: 18.4.2013
Пользователь №: 484 176



Репутация:   0  


shouhei
Спасибо за подробные разъяснения! super.gif

Цитата(shouhei @ 20.5.2018, 22:22) *

Я не могу понять, что надо с ними делать то?

Собственно цель, аналогичная цели Тоска (и еще кучи других организаций в мире) - "Открытые данные".
Выкладывает госконтора различного рода информацию (списки. перечни. статистику и т.п.) в так называемом "машиночитаемом виде". Вроде бы как кто будет брать эти файлы (скажем, путем автоматического обращения к соответствующему разделу сайта) и использует их в каком-нибудь полезном для граждан приложении. smile.gif

Цитата(shouhei @ 20.5.2018, 22:22) *

То есть всё — вопрос форматирования. Всё внутри кавычек, ограниченное разделителями — это одно поле.

Есть некоторые непонятности.
1. На мой взгляд, нужно исходить из того, что пользователи, ведущие таблицы в excel - они делают это как обычно, не задумываясь о чаяниях программистов, которые может быть будут использовать их таблы. biggrin.gif
2. Следовательно эти ковычки - они проставляются скриптом, т.е. алгоритм, который каждую ячейку таблицы (при преобразовании в csv) заключает в ковычки.
3. Почему заключают в ковычки - вроде бы понятно - чтобы уберечься от неожиданностей в тексте таблиц, т.к. данные могут быть разные, а скрипт - один.
Но что именно не понятно:
В ОС Windows, параметр - "разделитель элементов списка" по умолчанию ";", сколько я смотрел файлы из баз ОД, которые идут именно в формате "csv" (потому что встречаются варианты и с xml, JSON и еще чего-то там) они с разделителем именно ",". т.е. вопреки умолчанию Windows.
» Спойлер (нажмите, чтобы прочесть) «

Предполагаю, что скрипты проставляют именно ","
Вопрос: в чем такая принципиальная разница между "," и ";"?

Цитата(shouhei @ 20.5.2018, 22:22) *

Таблицу из этих строк строит сам табличный процессор, ориентируясь по разделителям.

Тогда вопрос: biggrin.gif
Когда я формирую csv в excel, то открыв его на любой машине - вижу данные в виде таблицы.
Значит ли это, что если я сформирую файл csv не в MS Excel, а в другом ПО (скажем в OpenOffice), использующем другую кодировку, то "родное" ПО будет читать его нормально на любой машине, а тот же MS Excel уже будет выдавать построчный набор с "кракозябрами"?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
shouhei
сообщение 22.5.2018, 18:44
Сообщение #9


Himmelsstürmer
Group Icon


Группа: Супермодераторы
Сообщений: 33 325
Регистрация: 2.4.2008
Из: Caught somewhere in time
Пользователь №: 27 739



Репутация:   1413  


Цитата(broun @ 21.5.2018, 0:03) *

1. На мой взгляд, нужно исходить из того, что пользователи, ведущие таблицы в excel - они делают это как обычно, не задумываясь о чаяниях программистов, которые может быть будут использовать их таблы. biggrin.gif


Значит, если идёт забота именно о пользователях, то нужно выкладывать готовые xls или ods(open document sheet — формат по умолчанию для Open Office всех вариаций, MS Excel начиная с 2007, вроде бы, умеет его читать), если же нужны данные для какой-то автоматизированной обработки, то csv или xml — самое оно. Впрочем, в случае xml есть нюансы, но MS Excell любой xml файл может спокойно преобразовать в таблицу. Да и парсер для какой-либо структуры xml писать сложнее, нежели для csv.

Цитата(broun @ 21.5.2018, 0:03) *

2. Следовательно эти ковычки - они проставляются скриптом, т.е. алгоритм, который каждую ячейку таблицы (при преобразовании в csv) заключает в ковычки.


Намного проще. Если табличный процессор воспринимает ячейку как текст, то он запишет её в кавычках. Если как число — то просто как число, без кавычек.

Цитата(broun @ 21.5.2018, 0:03) *

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


Опять неверно, в общем случае.

Цитата(broun @ 21.5.2018, 0:03) *

Но что именно не понятно:
В ОС Windows, параметр - "разделитель элементов списка" по умолчанию ";", сколько я смотрел файлы из баз ОД, которые идут именно в формате "csv" (потому что встречаются варианты и с xml, JSON и еще чего-то там) они с разделителем именно ",". т.е. вопреки умолчанию Windows.


Ну это как раз очень просто. CSV — Comma Separated Values, то есть значения, разделённые запятыми. Так что канонически правильный разделитель полей в файле — запятая. Ну и само собой для чисел, в таком случае разделителем должна быть точка.

Ну и эта, скриптам GUI не нужен. И даже консольное окно не нужно в общем-то.

Цитата(broun @ 21.5.2018, 0:03) *

Когда я формирую csv в excel, то открыв его на любой машине - вижу данные в виде таблицы.
Значит ли это, что если я сформирую файл csv не в MS Excel, а в другом ПО (скажем в OpenOffice), использующем другую кодировку, то "родное" ПО будет читать его нормально на любой машине, а тот же MS Excel уже будет выдавать построчный набор с "кракозябрами"?


В общем случае — неверно. MS Excel считает csv файлами только файлы в кодировке Windows-1251, может быть ещё и Codepage 866, но тут не уверен. Опять таки, в Libre Office, если мне память не изменяет, можно указать какую кодировку использовать при создании файла. В твоём примере с файлом с сайта администрации Томска — была кодировка UTF-8, и да, Open/Libre Office при любой операционной системе, не важно Win или *nix, вероятнее всего откроет его в виде нормальной таблицы. Из-за этого, например, у меня в качестве обработчика csv файлов по умолчанию на работе(там Windows) стоит Libre Office Calc, потому что он в любой кодировке откроет или спросит, в какой кодировке открывать. Но это всё мелочи.

Что ты хочешь получить и откуда? Например, любая СУБД, спокойно экспортирует данные, полученные тобой при помощи хитрого запроса в csv. Вопрос только в кодировках(в случае MS Excel)


» Спасибо сказали: «
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
broun
сообщение 25.5.2018, 15:07
Сообщение #10


Поддерживает разговор
Group Icon


Группа: Пользователи
Сообщений: 118
Регистрация: 18.4.2013
Пользователь №: 484 176



Репутация:   0  


shouhei спасибо.
А еще можно вопросик.
Типы данных (integer, date, memo, string и т.д.)

В excel есть опция -"формат ячеек", где, в том числе можно выбрать тип данных.
Понятны integer и date, а вот как быть с memo и string:
» Спойлер (нажмите, чтобы прочесть) «

Т.е. тут разница в размере поля.
Суть в чём?
Нужно непросто перевести xls в csv, но и описать какие типы данных используются в таблице.
В эксельке можно выставить тип - "Текстовый" и печатать сколько влезет.
А с точки зрения программиста, который будет использовать csv для получения данных из него - нужно точно задать тип данных, поля а в excel нет явного деления между типами memo и string.

или
В csv вообще нет такого понятия как "тип данных", и программист может лепить любой ТД?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
shouhei
сообщение 27.5.2018, 1:15
Сообщение #11


Himmelsstürmer
Group Icon


Группа: Супермодераторы
Сообщений: 33 325
Регистрация: 2.4.2008
Из: Caught somewhere in time
Пользователь №: 27 739



Репутация:   1413  


Если есть желание заморачиваться с типизацией данных, то нужно экспортировать в XML, составить правила преобразования и вперёд. Назад в Excell загрузится тоже без проблем.

В csv же нет такого понятия как "тип поля", "тип данных". Там есть данные и есть разделители. Ну и уступка про кавычки — если разделитель внутри кавычек, то он не разделитель, а элемент данных.

Все остальные преобразования типов — на совести парсера, который можно написать и самому, чтобы он выдавал таблицу excel, вот там уже можно будет точно также подсовывать правила, типы полей, но всё — в другом файле, не csv. Хотя, можно сделать и csv — по типу координата 1, координата 2, тип поля.

Но всё это — излишне. Если стоит задача — открытые данные, как на уже на упомянутом сайте администрации Томска, там ещё есть файлы с версией формата данных, чтобы программист, который автоматизирует их получение и загрузку, мог управлять импортом этих данных в информационную систему. Но оно — выше описано как. Как по мне — так излишне.


» Спасибо сказали: «
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. просматривают этот форум (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

Текстовая версия Сейчас: 20.9.2018, 21:35
Редакция: (383) 347-86-84

Техподдержка: (383) 347-22-44
help.sibnet.ru
Пользовательское соглашение
Размещение рекламы:
тел: (383) 347-06-78, 347-10-50

Правила использования материалов
Политика конфиденциальности