Форум сайта python.su
0
Здравствуйте, уважаемые форумчане!
Мне необходимо перевести данные из текстовых файлов блокнота в более структурированный вид для дальнейшей обработки в екселе. Файлы большие (по 1 мб), но имеют определенную структуру, хотя и путанную (см. вложение).
Конечно у меня появилось желание это автоматизировать … (иначе придется в ручную …)
Хотелось бы услышать советы бывалых: как лучше подступиться, какие грабли обойти, какими модулями воспользоваться и т.д.
У меня очень мелкий опыт работы в питоне, я хотел бы его расширить на примере решения данной задач.
Пока вижу след. алгоритм:
1. считываем весь файл в переменную
2. перебирать по строкам и сравнивать с условием (начало строки удовлетворяет условию)
3. в случае удовлетворения разбивать по разделителям
4. формировать гигантский список (исходя из кучи условий)
5. запись в файл
Очень смущает работа с условиями (if … elif …) - у меня они получаются просто огромными,а в итоге все равно что-нить да пропустишь …
Прикреплённый файлы:
exemple.txt (13,3 KБ)
Офлайн
568
Во-первых, файл можно (и нужно) читать (как собственно и писать) порциями-строками, не загружая в память все содержимое файла и не создавая “гигантского списка”. Во-вторых, интересен размер оперативной памяти Вашей машины, для которой 1Мб - это гигантский список. В-третьих, огромные конструкции if, как правило означают плохо продуманный алгоритм. Наверняка можно создать словарь “значение : функция”.
Офлайн
857
xenonтам у тебя не разделители, а фиксированные поля
3. в случае удовлетворения разбивать по разделителям
Офлайн
0
В-третьих, огромные конструкции if, как правило означают плохо продуманный алгоритм. Наверняка можно создать словарь “значение : функция”- понял, буду использовать словари
по заголовку с номерами определяется ширина каждого поля (сохраняется список)- начинаю понимать, большое спасибо за идею
для каждой строки под заголовком с номерами перебираются ширины полей
срез строки подойдёт
Офлайн
253
Я посмотрел файл.
Экселовский файл надо делать наверное с большим количеством страниц, По странице на лесничество :(
Насколько я понимаю заголовки таблиц надо выбросить. Для этого подойдут регулярные выражения (по опыту этот подход более устойчив к изменениям формата файла) или просто пересчитывая строки.
Остальное лучше разбирать тоже регулярными выражениями а не разделителями поскольку там встречаются “БОНИТЕТ ПО ТУМ” которые как я понял одно значения.
Вообще для такого файла эксел плохой формат. У вас явно выраженная двухуровневая древовидная структура. В данных куча пробелов. Лучше hdf5 или на худой конец yaml.
Офлайн
857
xenonдля начала разберись в самом формате файла
начинаю понимать, большое спасибо за идею
: 1 : 2 : 3 :4: 5 : 6 : 7 : 8 : 9:10:11:12: 13 : 14 : 15 : 16 : 17 :18: 19 : 20 : 21 : 22 : 23 : 24 :
------------------------------------------------------------------------------------------------------------------------------------
...
15 57,1 10Б 1 25 Б 120 25 24 12 4 3 ЗМ 0,6 19 1085 1085 2
7Е3П 2 17 Е 90 17 16 0,4 10 571 400 1
П 17 16 171 1
подрост: 5П3Е2К (20) 3,0 м, 3,0 тыс.шт/га,БЛАГОНАДЕЖНЫЙ
ОЗУ: полосы леса по берегам рек заселенных бобрами
19 11,4 10Б 1 25 Б 120 25 24 12 4 3 ЗМ 0,5 16 182 182 2
7Е3П 2 17 Е 90 17 16 0,3 7 80 56 1
П 17 16 24 1
Отредактировано py.user.next (Июль 24, 2013 10:51:44)
Офлайн
0
Большое спасибо всем откликнувишмся!!!
Экселовский файл надо делать наверное с большим количеством страниц, По странице на лесничество :(- нет, в екселевском файле одна страница, там идентификация идет по номеру квартала (над заголовком) + номер участка выдела (колонка №1)
“БОНИТЕТ ПО ТУМ” которые как я понял одно значения.- да, вы правы
Вообще для такого файла эксел плохой формат. У вас явно выраженная двухуровневая древовидная структура. В данных куча пробелов. Лучше hdf5 или на худой конец yaml.- спасибо за информацию к размышлению.
что этот кусок означает ?первые три строки (после многоточия):
по заголовку с номерами определяется ширина каждого поля (сохраняется список)
для каждой строки под заголовком с номерами перебираются ширины полей
срез строки подойдёт
Прикреплённый файлы:
exemple.xls (22,5 KБ)
Офлайн
857
xenonподготовка:
думаю с начало попробовать так:
Отредактировано py.user.next (Июль 26, 2013 07:26:15)
Офлайн
0
py.user.next - спасибо большое, буду пробовать!!!
Офлайн