Форум сайта python.su
Есть текстовый файл, содержимое выглядит таким образом:
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
......
Офлайн
O_o, сорри за лексику, но ниасилил я описание проблемы с утра. Можно было просто написать “что есть” и “что надо”.
Сейчас до работы доеду, попью кофе и напишу решение, заодно буду пропагандировать использовать sqlite :)
Отредактировано (Окт. 20, 2008 07:13:51)
Офлайн
Текстовый файл сохрани как 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
Офлайн
Пересмотрев русскую и англоязычную литературу — не наткнулся на метод решения через строки, массивы, кортежи … подобной сортировки разнобойных данных (может быть плохо смотрел? :)))
По поводу CSV … задумывался, но думал возможно есть метод решения внутри питона в работе с массивами или кортежами с помощью регулярок и циклов сделать подобную сортировку … просто я начинающий познавать :))) если этот путь тупиковый (нет света в конце тоннеля то лучше предупредите сразу, чтобы время не терять :)))) …
можно, что-нибудь сделать вот так:
>>>t1 = open ('c://text.txt', 'r')
>>> t2 = t1.read().split(',')
>>> for line in t2:
if line.strip():
print line
Офлайн
igor.kaistЗришь в корень. Если не хватает стандартного модуля csv, то почему бы не воспользоваться sqlite3?
Сейчас до работы доеду, попью кофе и напишу решение, заодно буду пропагандировать использовать sqlite smile
Офлайн
В этом то и проблема что данные в разнобой… Данные должны с самого начала иметь четкую структуру, для этого как раз и придумали 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)
ZANЭто сарказм? :-)
Зришь в корень. Если не хватает стандартного модуля csv, то почему бы не воспользоваться sqlite3?
Офлайн
Ну можно и без csv. Я просто использовал чтобы быстрей разбить на поля раз они отделяется запятыми. Можно использовать и без чет/нечет, просто регулярками проверять:
к примеру если первое поле в строке соответствует ^{2}\-{2}\-{4}$ - то это “нечетная” строка
если первое поле в строке ^{2}:{2}$ - то это “четная” строка.
Если ничему не соответствует, значит “заголовок” какой-нибудь и пропускаем его.
И если хочешь без CSV, можешь просто считывать строку и разбивать ее (split) через регулярку (что-то типа "+\.\)" ) на поля.
Отредактировано (Окт. 20, 2008 15:42:31)
Офлайн
Всё очень просто, но документация по языку, конечно не поможет. Просто нужно подумать.
Я разобью задачу на несколько подзадач. Сначала, давай, получим кортежи строк по две:
def read(text):
lines = text.splitlines()
while len(lines) > 1:
yield lines[0].strip(), lines[1].strip()
del lines[:2]
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
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)
Отредактировано (Окт. 20, 2008 15:41:03)
Офлайн
igor.kaistХм… Не подумал, что фраза может быть так воспринята.
Это сарказм? :-)
Офлайн
ZAN, а я долго думал сарказм это или нет :-)
я эту базу данных люблю.. Легкая, удобная и не требует установки.
По крайней мере быстрее чем csv должна быть. У меня рабочие проекты на ней держаться. 400 тыс записей, и хоть бы что..
Видел коммерческие проекты, которые требовали установки microsoft sql server, ради каких то нескольких тысяч записей.. Руки нужно оторвать этим программистам.
Толи дело sqlite3.. Кроссплатформенна, имеет бинды практически ко всем языкам программирования, а в случае с питоном, вообще идет в комплекте..
Система администрирования в зипе, всего 1.5 метра занимает :)
для данных, более 50 записей, sqlite3- мой выбор!
Агитация закончена :)
Офлайн