|
Внимание! Теперь для входа на форум необходимо вводить единый пароль регистрации сервисов sibnet.ru!
Здравствуйте, гость ( Вход | Регистрация )
 Сейчас обсуждают
 
| |
|
  |
Преобразование Xls (xlsx) в Csv |
|
|
broun |
20.5.2018, 13:44
|
Поддерживает разговор
Группа: Пользователи
Сообщений: 133
Регистрация: 18.4.2013
Пользователь №: 484 176
Репутация: 0

|
Добрый день! 1. Есть файл Excel:
1.rar ( 9.5 килобайт )
Кол-во скачиваний: 58» Спойлер (нажмите, чтобы прочесть) «  2. Пересохраняю его в формате csv: » Спойлер (нажмите, чтобы прочесть) «  3. Получаем:
2.rar ( 719 байт )
Кол-во скачиваний: 54» Спойлер (нажмите, чтобы прочесть) «  Что не так? 1. Сохранял я с разделителями - запятые, а тут ими вообще не пахнет. 2. Возьмём с сайта администрации города Томска файл:
data_20180411_structure_20180411.rar ( 979 байт )
Кол-во скачиваний: 35» Спойлер (нажмите, чтобы прочесть) « Сайт администрации - Администрация - Открытые данные - Гиперссылка (URL) на открытые данные http://www.admin.tomsk.ru/odata/id/7021023925-DOLG3. Откроем его с помощь 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
|
Поддерживает разговор
Группа: Пользователи
Сообщений: 133
Регистрация: 18.4.2013
Пользователь №: 484 176
Репутация: 0

|
Но даже если (эксперимента ради) я напишу исходные данные вот в таком виде: » Спойлер (нажмите, чтобы прочесть) «  Он в csv сохранит данные в оригинальном виде, но после обратного преобразования опять получится что-то не совсем правильное - какие-то точки с запятой: » Спойлер (нажмите, чтобы прочесть) «  В любом случае, ТАК писать таблицу в Excel пользователи не должны. Сообщение отредактировал broun - 20.5.2018, 14:02
|
|
|
|
KoМат |
20.5.2018, 15:45
|

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

|
Я заменил разделитель элементов с ; на , в : » Спойлер (нажмите, чтобы прочесть) « при этом еще пришлось поменять разделитель целой и дробной части там же с , на . , чтобы запятая не повторялась в качестве разделителя. После этого Excel стал сохранять с запятой в качестве разделителя.
» Спасибо сказали: «
|
|
|
|
broun |
20.5.2018, 19:45
|
Поддерживает разговор
Группа: Пользователи
Сообщений: 133
Регистрация: 18.4.2013
Пользователь №: 484 176
Репутация: 0

|
Цитата(KoМат @ 20.5.2018, 15:45)  Я заменил разделитель элементов с ; на , в : » Спойлер (нажмите, чтобы прочесть) « при этом еще пришлось поменять разделитель целой и дробной части там же с , на . , чтобы запятая не повторялась в качестве разделителя. После этого Excel стал сохранять с запятой в качестве разделителя. Спасибо. Это помогло при обратном преобразовании (сложной таблицы, с запятыми в тексте - не из примера) выстроить текст в ячейках нормально. Но тут вопрос получается вот в чем: Если брать пример с сайта адм Томска, то там принцип записи другой: нет как таковой таблицы - все в виде текстовой строки. Замена типов разделителей (из Вашего примера) никак не повлияла на преобразование в читабельный вид. А в моем случае получается какая-то зависимость от типов разделителей, заданных в системе. Это смущает.
|
|
|
|
shouhei |
20.5.2018, 20:48
|

Himmelsstürmer
Группа: Events and facts club
Сообщений: 33 866
Регистрация: 2.4.2008
Из: Caught somewhere in time
Пользователь №: 27 739
Репутация: 1420

|
Точка с запятой — нормальный, конвенциональный разделитель для csv. Если сильно хочется, csv представляет собой обыкновенный текстовый файл, разделитель можно поменять на любой другой в любом текстовом редакторе, том же блокноте.
То, что при импорте csv в MS Excell или даже Open/Libre Office calc теряется форматирование ячеек — это абсолютно нормальный и правильный процесс, потому что в csv такая информация просто не хранится.
Самый простой выход — как раз использовать мастер импорта в Excel.
Что касается типов разделителей дробной и целой части. Да, в системах, где разделитель дробной части числа — запятая, может выйти такой казус. Региональные стандарты — они суровы. Вот как раз поэтому, выгоднее всего в качестве разделителя полей использовать точку с запятой. Избегаешь путаницы, сохраняешь нормальные значения ячеек.
И пример с сайта администрации — там обыкновенный csv. Самый обыкновенный. Какрй и должен формироваться при сохранении табличных данных в csv
» Спасибо сказали: «
|
|
|
|
broun |
20.5.2018, 21:46
|
Поддерживает разговор
Группа: Пользователи
Сообщений: 133
Регистрация: 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
|

Himmelsstürmer
Группа: Events and facts club
Сообщений: 33 866
Регистрация: 2.4.2008
Из: Caught somewhere in time
Пользователь №: 27 739
Репутация: 1420

|
Цитата(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
|
Поддерживает разговор
Группа: Пользователи
Сообщений: 133
Регистрация: 18.4.2013
Пользователь №: 484 176
Репутация: 0

|
shouheiСпасибо за подробные разъяснения! Цитата(shouhei @ 20.5.2018, 22:22)  Я не могу понять, что надо с ними делать то?
Собственно цель, аналогичная цели Тоска (и еще кучи других организаций в мире) - "Открытые данные". Выкладывает госконтора различного рода информацию (списки. перечни. статистику и т.п.) в так называемом "машиночитаемом виде". Вроде бы как кто будет брать эти файлы (скажем, путем автоматического обращения к соответствующему разделу сайта) и использует их в каком-нибудь полезном для граждан приложении. Цитата(shouhei @ 20.5.2018, 22:22)  То есть всё — вопрос форматирования. Всё внутри кавычек, ограниченное разделителями — это одно поле.
Есть некоторые непонятности. 1. На мой взгляд, нужно исходить из того, что пользователи, ведущие таблицы в excel - они делают это как обычно, не задумываясь о чаяниях программистов, которые может быть будут использовать их таблы. 2. Следовательно эти ковычки - они проставляются скриптом, т.е. алгоритм, который каждую ячейку таблицы (при преобразовании в csv) заключает в ковычки. 3. Почему заключают в ковычки - вроде бы понятно - чтобы уберечься от неожиданностей в тексте таблиц, т.к. данные могут быть разные, а скрипт - один. Но что именно не понятно:В ОС Windows, параметр - "разделитель элементов списка" по умолчанию ";", сколько я смотрел файлы из баз ОД, которые идут именно в формате "csv" (потому что встречаются варианты и с xml, JSON и еще чего-то там) они с разделителем именно ",". т.е. вопреки умолчанию Windows. » Спойлер (нажмите, чтобы прочесть) « Я уж не знаю какие умолчания стоят в GUI юниксовых систем, но что-то мне подсказывает, что 99% созданы под MS Windows Предполагаю, что скрипты проставляют именно "," Вопрос: в чем такая принципиальная разница между "," и ";"? Цитата(shouhei @ 20.5.2018, 22:22)  Таблицу из этих строк строит сам табличный процессор, ориентируясь по разделителям.
Тогда вопрос: Когда я формирую csv в excel, то открыв его на любой машине - вижу данные в виде таблицы. Значит ли это, что если я сформирую файл csv не в MS Excel, а в другом ПО (скажем в OpenOffice), использующем другую кодировку, то "родное" ПО будет читать его нормально на любой машине, а тот же MS Excel уже будет выдавать построчный набор с "кракозябрами"?
|
|
|
|
shouhei |
22.5.2018, 18:44
|

Himmelsstürmer
Группа: Events and facts club
Сообщений: 33 866
Регистрация: 2.4.2008
Из: Caught somewhere in time
Пользователь №: 27 739
Репутация: 1420

|
Цитата(broun @ 21.5.2018, 0:03)  1. На мой взгляд, нужно исходить из того, что пользователи, ведущие таблицы в excel - они делают это как обычно, не задумываясь о чаяниях программистов, которые может быть будут использовать их таблы. Значит, если идёт забота именно о пользователях, то нужно выкладывать готовые 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
|
Поддерживает разговор
Группа: Пользователи
Сообщений: 133
Регистрация: 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
|

Himmelsstürmer
Группа: Events and facts club
Сообщений: 33 866
Регистрация: 2.4.2008
Из: Caught somewhere in time
Пользователь №: 27 739
Репутация: 1420

|
Если есть желание заморачиваться с типизацией данных, то нужно экспортировать в XML, составить правила преобразования и вперёд. Назад в Excell загрузится тоже без проблем.
В csv же нет такого понятия как "тип поля", "тип данных". Там есть данные и есть разделители. Ну и уступка про кавычки — если разделитель внутри кавычек, то он не разделитель, а элемент данных.
Все остальные преобразования типов — на совести парсера, который можно написать и самому, чтобы он выдавал таблицу excel, вот там уже можно будет точно также подсовывать правила, типы полей, но всё — в другом файле, не csv. Хотя, можно сделать и csv — по типу координата 1, координата 2, тип поля.
Но всё это — излишне. Если стоит задача — открытые данные, как на уже на упомянутом сайте администрации Томска, там ещё есть файлы с версией формата данных, чтобы программист, который автоматизирует их получение и загрузку, мог управлять импортом этих данных в информационную систему. Но оно — выше описано как. Как по мне — так излишне.
» Спасибо сказали: «
|
|
|
|
|
  |
1 чел. просматривают этот форум (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|