Здесь изобретаем вот такой велосипед filter(None, line.split(' ')), редактируем методы класса, и парсим в новые подпапки (1feb). Новый "ввелосиед" оказался почти идеальным. В конце поста это видно по размерам файлов в папках.
!chcp 65001
!dir C:\Users\kiss\Documents\Xpdf\aebru_2014_all_txt
Пропишем путь к рабочему модулю в переменную окружения¶
import sys
sys.path.append('C:\\Users\\kiss\\SkyDrive\\Docs\\pdftotext\\AEB\\pdgtotext')
sys.path
Вот он, последний, теперь импортируем все сюда
from aebto3tables import *
Проверим, вот константа из модуля:
CSVFOLDER
class February(Aebto3tables):
"""Try to tune august"""
#txtfile_path = 'C:\\Users\\kiss\\Documents\\Xpdf\\aebru_2014_all_txt\\eng_car-sales-in-august-2014.txt'
#csvfilename = 'eng_car-sales-in-august-2014.csv'
#
def tab1fromtxt(self, txtfile_path, csvfilename, csvfolder=CSVFOLDER):
"""
Первая таблица - самые продаваемые марки (50 строк)
Вот первые две:
Lada 151527 159490 -5% 44100 50102 -12%
Renault* 67208 57217 17% 19178 17914 7%
"""
t1 = []
with open(txtfile_path) as f1:
for line in f1:
lns1 = filter(None, line.split(' '))
if len(lns1) in range(6, 9):
if (lns1[-1].find('-') != -1) | (lns1[-1].find('%') != -1):
if (lns1[-4].find('-') != -1) | (lns1[-4].find('%') != -1):
if (line.partition(' ')[2] != ['']) and (line.partition(' ')[0].strip() != 'Total'):
tline = map(str.strip, lns1)
t1.append(tline)
csvfile_path = csvfolder + '\\1feb\\' + csvfilename
self.tocsv(t1, csvfile_path)
#print t1
def tab2fromtxt(self, txtfile_path, csvfilename, csvfolder=CSVFOLDER):
"""
Вторая - суммарные продажи по фирмам (все фирмы)
NISSAN 30,9 31,1 266169 274285 -3% 29,3 30,2 71977 80630 -12%
AVTOVAZ 17,6 18,1 151527 159490 -5% 18,0 18,8 44100 50102 -12%
"""
t2 = []
with open(txtfile_path) as f2:
for line in f2:
lns2 = filter(None, line.split(' '))
if len(lns2) in range(11, 12):
if (lns2[-1].find('-') != -1) | (lns2[-1].find('%') != -1):
if (lns2[-6].find('-') != -1) | (lns2[-6].find('%') != -1):
if (line.partition(' ')[2] != ['']): #
tline = map(str.strip, lns2)
t2.append(tline)
csvfile_path = csvfolder + '\\2feb\\' + csvfilename
self.tocsv(t2, csvfile_path)
#print t2
def tab3fromtxt(self, txtfile_path, csvfilename, csvfolder=CSVFOLDER):
"""
Третья должна состоять из 25 строк вида:
1 Granta Lada 52765 26674 98% 15596 9798 59%
2 Solaris Hyundai 35941 38051 -6% 10553 10979 -4%
"""
t3 = []
with open(txtfile_path) as f3:
for line in f3:
lns3 = filter(None, line.split(' '))
if len(lns3) in range(11, 16):
if lns3[0].isdigit():
if (line.find(' ') != -1):
if (line.partition(' ')[2] != ['']) and (line.partition(' ')[0].isdigit()):
tline = map(str.strip, lns3)
t3.append(tline)
csvfile_path = csvfolder + '\\3feb\\' + csvfilename
self.tocsv(t3, csvfile_path)
#print t3
txtfile_path = 'C:\\Users\\kiss\\Documents\\Xpdf\\aebru_2014_all_txt\\sales-in-february_2014_eng_final.txt'
csvfilename = 'sales-in-february_2014_eng_final.csv'
F = February('2014-02')
Сначала пробуем "августовский код" и ищем причины ошибок¶
F.tab1fromtxt(txtfile_path, csvfilename)
infi ="Infiniti 1 304 1 551 -16% 833 926 -10%"
jeep = "Jeep 1 029 396 160% 609 250 144%
"
И как это я не заметил, здесь вместо 11,111 (ка было в августе) в таблице пишется 11 111. Вместо запятой - пробел. А у меня во всех трех методах стоят ограничения на количество элементов в строке. Если бы я их не поставил, было бы труднее понять причину ошибок... Так что получается, что, пока нет простого решения, многочисленные условия помогаю найти недостатки модели (алгоритма)... Формулировка не бесспорная...
Итак. Это хорошая (полезная) ошибка. Она прямо говорит: "Твои приемы парсинга никуда не годятся, придумай что-нибудь другое..."
И вот он, более простой вариант¶
#
filter(None, infi.split(' '))
list1=F.tab1fromtxt(txtfile_path, csvfilename)
len(list1)
F.tab1fromtxt(txtfile_path, csvfilename)
F.tab2fromtxt(txtfile_path, csvfilename)
F.tab3fromtxt(txtfile_path, csvfilename)
В этом новом варианте операторы с partition(' ') не нужны, однако я их пока не стал убирать¶
Вот, как они работают. Пока ясно, что те же проверки можно организовать и для вариант с фильтрацией... он проще
line.partition(' ')
line.partition(' ')[0].isdigit()
Запустим парсер, для этого¶
Раскоментируем строки:
# Было
#csvfile_path = csvfolder + '\\3feb\\' + csvfilename
#self.tocsv(t3, csvfile_path)
print t3
# Стало
csvfile_path = csvfolder + '\\3feb\\' + csvfilename
self.tocsv(t3, csvfile_path)
#print t3
И запустим выполнение¶
# Запускаем на выполнение
F.alltxt2csv()
Примечание: папки для записи результатов были созданы вручную заранее, нам здесь нужно было лишь отредактировать в сетодах эементы пути \1feb\, \2feb\, \3feb\
Результаты обнадеживают
!dir C:\Users\kiss\Documents\Xpdf\aerbu_2014_all_csv
!dir C:\Users\kiss\Documents\Xpdf\aerbu_2014_all_csv\1feb
!dir C:\Users\kiss\Documents\Xpdf\aerbu_2014_all_csv\2feb
!dir C:\Users\kiss\Documents\Xpdf\aerbu_2014_all_csv\3feb
Посты чуть ниже также могут вас заинтересовать
Комментариев нет:
Отправить комментарий