Найти - Пользователи
Полная версия: модификация данных в строках
Начало » Python для экспертов » модификация данных в строках
1 2
-do
Есть текстовый файл, содержимое выглядит таким образом:

01-09-2008,1)Сидоров,2)14.05.1996,3)user@host.com,4)120.60,5)нет,6)Ушакова,7)26,8)15,\n
15:20,9)Иван,10)дополнительная текстовая информация,11)оценка,12)7.8,\n
01-09-2008,1)Кузнецова,2)27.02.1996,3)user2@host.com,4)115.10,5)нет,6)Ворошилова,7)4,8)102,\n
15:40,9)Мария,10)дополнительная текстовая информация,11)оценка,12)8.1,\n
......
После открытия и считывания содержимого файла, выделить пары строк с “общей для них информацией” и преобразовать в одну с включением данных со второй строки в определенные места первой строки и убрать индексы данных.
Все данные отделены друг от друга знаком «,» (запятой), в дополнительной текстовой информации данные “закавычены” (так,что запятые в ней не влияют), первые данные в строках это дата регистрации записи (она формируется автоматически для каждой записи) …

В итоге должно получиться вот это:

01-09-2008,15:20,Сидоров,Иван,14.05.1996,user@host.com,120.60,нет,Ушакова,26,15,дополнительная текстовая информация,оценка,7.8,\n
01-09-2008,15:40,Кузнецова,Мария,27.02.1996,user2@host.com,115.10,нет,Ворошилова,4,102,дополнительная текстовая информация,оценка,8.1,\n
......
вот такая вот головоломка :))))

Этот адрес: http://docs.python.org/index.html ЗНАЮ! :)))

Насчет почитать книг побольше — собрал практически всё, что можно и сидел просматривая и пробуя (если у кого-нибудь есть конкретная потребность в электронной книге могу поделиться при наличии у меня:)))))

Прошу хотя бы натолкнуть на мысль в какую сторону “рыть” и какими средствами (методами, функциями …) :)
igor.kaist
O_o, сорри за лексику, но ниасилил я описание проблемы с утра. Можно было просто написать “что есть” и “что надо”.
Сейчас до работы доеду, попью кофе и напишу решение, заодно буду пропагандировать использовать sqlite :)
timas
Текстовый файл сохрани как csv, а далее как-то так
import csv
import re

input_file = open("data.csv", "rb")
rdr = csv.reader(input_file)

second=1 #четная/нечетная строка
date=surname=time=name=""

for rec in rdr:
if second%2: #нечетная
date=rec[0]
surname=re.sub(r"^[0-9]+\)", "", rec[1])
else: #четная
time=rec[0]
name=re.sub(r"^[0-9]+\)", "", rec[1])
print date + ',' + time + ',' + surname + ',' + name
second+=1
Это только для первых двух полей в каждой строке, ну а дальше по аналогии
-do
Пересмотрев русскую и англоязычную литературу — не наткнулся на метод решения через строки, массивы, кортежи … подобной сортировки разнобойных данных (может быть плохо смотрел? :)))

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

можно, что-нибудь сделать вот так:

>>>t1 = open ('c://text.txt', 'r')
>>> t2 = t1.read().split(',')
>>> for line in t2:
if line.strip():
print line
вместо принта line записать в новый файл и потом регуляркой по индексам произвести нужную манипуляцию с перестановкой и вновь собрать строки уже с изменениями?

И еще … выше код с CSV основан на четности-нечестности строк, а если есть дополнительная информация в тексте файла в виде заголовков разделов которые нарушают четность строк при попадании? …

Каким путем лучше идти? Чтобы не слишком привязываться к шаблонному оформлению (четность/нечетность строк) или выпадение пустой ячейки (к примеру не указаны 6,7,8 индекс (адресные данные) …

Я понимаю, что Python могуч :))), но возможно из-за незнания переоценить его возможности и пойти не тем путем … :))))
ZAN
igor.kaist
Сейчас до работы доеду, попью кофе и напишу решение, заодно буду пропагандировать использовать sqlite smile
Зришь в корень. Если не хватает стандартного модуля csv, то почему бы не воспользоваться sqlite3?
igor.kaist
В этом то и проблема что данные в разнобой… Данные должны с самого начала иметь четкую структуру, для этого как раз и придумали csv, xml и пр.
Ведь если попадаются исключения, то нужно предусмотреть все эти исключения.
вообщем можно сделать что то типа этого… набросок
sp=stroka.split(',') # получили список строк вида "4)120.60"
print 'date=',sp[0] # это дата
def get_numb(n,sp): # функция которая ищет значения поля по его номеру
for x in sp:
if x.startswith(str(n)):return x.split(')')[1]
return ''
print get_numb(1,sp)
Может не слишком элегантно, но работать должно, с чет-нечет строками я думаю разберешься.
Как записать в csv потом, думаю тоже разберешься…
ZAN
Зришь в корень. Если не хватает стандартного модуля csv, то почему бы не воспользоваться sqlite3?
Это сарказм? :-)
timas
Ну можно и без csv. Я просто использовал чтобы быстрей разбить на поля раз они отделяется запятыми. Можно использовать и без чет/нечет, просто регулярками проверять:
к примеру если первое поле в строке соответствует ^{2}\-{2}\-{4}$ - то это “нечетная” строка
если первое поле в строке ^{2}:{2}$ - то это “четная” строка.
Если ничему не соответствует, значит “заголовок” какой-нибудь и пропускаем его.

И если хочешь без CSV, можешь просто считывать строку и разбивать ее (split) через регулярку (что-то типа "+\.\)" ) на поля.
bw
Всё очень просто, но документация по языку, конечно не поможет. Просто нужно подумать.
Я разобью задачу на несколько подзадач. Сначала, давай, получим кортежи строк по две:
def read(text):
lines = text.splitlines()
while len(lines) > 1:
yield lines[0].strip(), lines[1].strip()
del lines[:2]
Результатом этого метода будет список кортежей, каждый кортеж будет содержать по две строки из источника text. Так как метод является генератором, то на выходе мы получим объект итератор, а не список как таковой. Это нужно учитывать. Что бы получить список, достаточно результат метода передать list, но я этого делать не буду.

Теперь из извлечем дату и время из кортежа, а так же откорректируем сам кортеж, т.е. вырежим из него эти элементы:
def cut_datetime(record):
date, _ = record[0].split(',', 1)
time, _ = record[1].split(',', 1)
record = record[0][len(date) + 1:], record[1][len(time) + 1:]
return date + ',' + time, record
Теперь пройдемся по оставщимся данным в кортеже и извлечем их в виде ключа и значения для каждой пары вида 1)Сидоров:
def extract(record):
data = record[0].strip() + ',' + record[1].strip()
for line in data.split(','):
line = re.search('^(\d+)\)(.*)$', line.strip())
if line:
key, value = line.groups()
key, value = int(key), value.strip()
yield key, value
Ну а теперь объеденим всё в кучу (лень дальше задачу дробить):
def process(text):
lines = []

for record in read(text):
datetime, record = cut_datetime(record)
record = dict(extract(record))
name = '%s,%s'%(record.pop(1), record.pop(9))

keys = record.keys()
keys.sort()
props = ','.join([record[key] for key in keys])

lines.append(datetime + ',' + name + ',' + props)

return '\n'.join(lines)
Надеюсь, разберешься.

p.s. process, это нужный тебе метод. Входом является необработынный набор строк, выходом - строки с упорядоченными данными.

..bw
ZAN
igor.kaist
Это сарказм? :-)
Хм… Не подумал, что фраза может быть так воспринята.
Нет, не сарказм :-)
igor.kaist
ZAN, а я долго думал сарказм это или нет :-)
я эту базу данных люблю.. Легкая, удобная и не требует установки.
По крайней мере быстрее чем csv должна быть. У меня рабочие проекты на ней держаться. 400 тыс записей, и хоть бы что..
Видел коммерческие проекты, которые требовали установки microsoft sql server, ради каких то нескольких тысяч записей.. Руки нужно оторвать этим программистам.
Толи дело sqlite3.. Кроссплатформенна, имеет бинды практически ко всем языкам программирования, а в случае с питоном, вообще идет в комплекте..
Система администрирования в зипе, всего 1.5 метра занимает :)
для данных, более 50 записей, sqlite3- мой выбор!
Агитация закончена :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB