Если скачивать отчеты AEB о продажах автомобилей каждый месяц, то как лучше вытаскивать 3 таблицы из pdf-файла? Сначала вызвать конвертер pdftotext при помощи subprocss, конвертировать и сохранить в текстовый файл, потом из него скопипастить все таблицы в отдельные ячейки. Исправить ручками все ошибки в таблицах, и только после этого привести таблицы к единому формату с помощью Pandas. И я все сделал для первой таблицы февраля 2015г., но вторая и третья таблицы пришли с ошибками, чтобы их понять пришлось их сравнивать со скриншотами оригинальных таблиц и вариантом копипаста прямо из pdf-файла. Итак, я здесь начал со ссылок на subprocss, потом "вспомнил" .str.
17.1. subprocess — Subprocess management Subprocess and Shell Commands in Python
Пример использования Python subprocess для выполнения команд консоли Windows
Читам 5 отличных статей про subprocess Python и смотрим три видеоролика
Удалить '%' и сменить формат на числовой (Важно! ))
Sales of cars and light commercial vehicles RSS
Начинаем с конвертера pdftotext¶
Только разбирая ошибки в конце этого поста я понял, как трудно конвертеру приходится с формированием таблиц и что, пожалуй, я был неправ, когда написал класс для пакетной обработки pdf-файлов. Из особенностей конвертера отметим только, что для Linux и Windows опции отличаются.
# Path to pdftotxt.exe and his options for Windows 8
CONVERTER = r'"C:/Program Files/Xpdf/bin64/pdftotext.exe"'
OPTIONS = r' -table'
# Path to pdftotxt.exe and his options for Linux Debian
CONVERTER = r'pdftotext' # r'"/usr/bin/pdftotext"'
OPTIONS = r' -layout'
# pdf file path
#pdffolder = '/media/MYLINUXLIVE/Documents/Xpdf/aebru_2015_all/'
pdffile_path = "/media/MYLINUXLIVE/Documents/Xpdf/aebru_2015_all/eng_car-sales-in-march-2015.pdf"
# target txt file path
#txtfolder = '/media/MYLINUXLIVE/Documents/Xpdf/aebru_2015_all_txt/'
txtfile_path = r'"/media/MYLINUXLIVE/Documents/Xpdf/aebru_2015_all_txt/eng_car_sales_in_march_2015.txt"'
Обратите внимание, здесь приходится менять шаблон названия файла, поскольку в ассоциации новый молодой администратор... eng_car-sales-in-march-2015.pdf на eng_car_sales_in_march_2015.txt
import pandas as pd
import numpy as np
from cStringIO import StringIO
import subprocess
from StringIO import StringIO
def pdftotext(pdffile_path, txtfile_path, converter=CONVERTER,
options=OPTIONS):
"""
pdftotext [options] [PDF-file [text-file]]
"""
pdftostdout = converter + options + ' ' + pdffile_path + ' ' + txtfile_path
print pdftostdout
# Call external process pdftotxt.exe
myProcess = subprocess.Popen(
pdftostdout,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, error = myProcess.communicate()
#out, error
pdftotext(pdffile_path, txtfile_path)
print pdffile_path
print txtfile_path
colnames_2015_t1 = ['Brandt', \
'2015m1', '2014m1', '1514m1', \
'2015y1', '2014y1', '1514y1']
Скопипастим сюда первую таблицу февраля (!!! март будет в следующем посте)¶
t1 = """
Lada 23,639 30,896 -23% 41,131 54,543 -25%
Hyundai* 13,233 13,901 -5% 25,940 24,945 4%
KIA 12,563 13,303 -6% 23,909 24,502 -2%
Nissan* 9,447 17,158 -45% 18,548 28,209 -34%
Renault* 9,100 16,721 -46% 17,909 29,615 -40%
Toyota* 7,143 11,892 -40% 14,292 20,211 -29%
VW 5,804 11,390 -49% 11,969 19,989 -40%
Škoda 5,618 6,384 -12% 10,743 11,128 -3%
Mercedes-Benz* 4,151 3,520 18% 7,326 6,230 18%
BMW 3,550 3,356 6% 6,095 5,896 3%
Mitsubishi 3,323 6,817 -51% 6,543 11,824 -45%
Chevrolet 3,255 12,448 -74% 6,305 21,868 -71%
GAZ LCV* 2,970 4,527 -34% 4,798 7,787 -38%
Datsun 2,904 - - 5,837 - -
Mazda 2,381 3,899 -39% 4,765 6,747 -29%
UAZ* 2,260 2,903 -22% 4,513 5,104 -12%
Audi 2,092 2,905 -28% 3,502 4,528 -23%
Daewoo 1,639 4,536 -64% 3,654 8,254 -56%
Ford* 1,399 6,306 -78% 3,212 10,556 -70%
Land Rover 1,183 1,867 -37% 1,958 2,789 -30%
Opel 912 6,610 -86% 1,985 10,891 -82%
Subaru 836 1,374 -39% 1,752 2,312 -24%
Lexus 791 714 11% 1,481 1,421 4%
Volvo 757 1,143 -34% 1,027 1,545 -34%
Lifan 721 1,548 -53% 1,484 2,666 -44%
Geely 681 1,687 -60% 1,131 2,845 -60%
VW vans 672 1,058 -36% 1,280 2,007 -36%
SsangYong 561 2,007 -72% 1,294 3,337 -61%
Mercedes-Benz vans 444 459 -3% 749 771 -3%
Infiniti 419 833 -50% 1,109 1,304 -15%
Suzuki 416 1,707 -76% 871 3,189 -73%
Great Wall 402 1,402 -71% 807 2,334 -65%
Chery 402 1,709 -76% 770 2,846 -73%
Porsche 381 174 119% 575 300 92%
Citroёn* 380 2,192 -83% 860 3,912 -78%
Peugeot* 377 2,354 -84% 795 4,197 -81%
FIAT* 345 581 -41% 641 988 -35%
Honda 252 2,484 -90% 636 4,413 -86%
Jeep 235 609 -61% 440 1,029 -57%
Brilliance 144 - - 241 - -
MINI 116 148 -22% 207 230 -10%
Acura** 89 - - 162 - -
Jaguar 75 157 -52% 134 251 -47%
Isuzu* 74 5 1380% 103 33 212%
JAC 38 - - 53 - -
Cadillac 34 97 -65% 72 177 -59%
smart 32 20 60% 51 37 38%
BAW* 24 118 -80% 53 231 -77%
Haima 20 21 -5% 61 41 49%
Chrysler 8 14 -43% 12 21 -43%
Foton* 3 3 0% 4 5 -20%
SEAT 2 112 -98% 33 184 -82%
Alfa Romeo 1 - - 4 - -
FAW - 234 - - 536 -
ZAZ - 113 - - 214 -
Changan - 50 - - 50 -
TagAZ* - 22 - - 28 -
Luxgen - 15 - - 27 -
Bogdan - 14 - - 70 -
Izh - 5 - - 15 -
Dodge - 4 - - 6 -
"""
pdt1 = pd.read_csv(StringIO(t1), names=colnames_2015_t1, \
na_values=['-','n/a'], \
sep=' {4,}', thousands=',')
pdt1.tail(10)
pdt1[:5]
Итак, оказалось, что Pandas вполне прилично использует регулярные варажения sep=' {4,}'. Более того, поскольку для регулярных выражений используется парсер Python, а не 'C', то и пропуск строк с ошибками пришлось отключить. А это правильно, я уже начал забывать, что "потерял" так несколько строк в предыдущем посте.
Добавим столбец даты¶
pdt1['Datem'] = '28-2-2015'
Почистим столбцы¶
pdt1.info(verbose=True, buf=None, max_cols=None, memory_usage=True, null_counts=True)
Удалить '%' и сменить формат на числовой (Важно! )¶
pdt1['1514y1'] = pdt1['1514y1'].str.replace('%','').astype(float)
pdt1['1514m1'] = pdt1['1514m1'].str.replace('%','').astype(float)
####Нужно ли убирать в первом столбце '*' ??? Пока не знаю. Отредактирую эту строчку, если решу убирать
# Тест
pdt1['Brandt'].str.replace('*','').astype(object)
pdt1['Brandt'].tail()
- LCV sales are included into total brand’s sales if exist in the product line of the brand (marked with*); reported separately for some brands. LCV<3,5t (with several exceptions reaching highest range of 6t). Some updates concerning LCV data may occur.
LCV sales - продажи легких коммерческих автомобилей
pdt1.info(verbose=True, buf=None, max_cols=None, memory_usage=True, null_counts=True)
pdt1.head(3)
pdt1.tail(3)
#### Теперь сохраним обект в CSV-файл
Идеальным было бы сохранить файл под тем же именем, что и оригинал..., но, естественно, с соответствующим расширением... Да не тут-то было. В оригинале в имени файла вместо подчерков тире. А мне нужна возможность для фильтра пакетной обработки файлов в папке. Так что про имя оригинала лучше забыть.
print pdffile_path
print txtfile_path
!ls /media/MYLINUXLIVE/Documents/Xpdf/
!mkdir /media/MYLINUXLIVE/Documents/Xpdf/aerbu_2015_all_csv
Посмотрим, как я планировал структуру папок:
!ls /media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv
В этой папке мне пришлось разместить подпапки с результатами работы разных парсеров. А изначально я планировал всего три подпапки для трех таблиц Таким образом, в каждой папке свой файл февраля. Не знаю, зачем нужны подпапки, если я все равно ставлю 1-3 в имени файла..., пока решил, что проще будет сосчитать 12 файлов, чем 36...
!ls /media/MYLINUXLIVE/Documents/Xpdf/aerbu_2015_all_csv
Шаблон для имени - исправить имя файла¶
t1name = 'eng_car_sales_in_feubrary_2015.csv'
t1folder = '/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2015_all_csv/1/'
colnames = list(pdt1.columns.values)
colnames
pdt1.to_csv(t1folder + t1name,
sep=';',
#float_format='%.8f',
columns=colnames,
index=False)
2015 2014 YOY 2015 2014 YoY 2015 2014 YOY 2015 2014 Yo
pdt2 =""""
AVTOVAZ-RENAULT-NISSAN 35.5 31.8 3.7 45,509 65,608 -30.6% 34.7 31.6 3.1 84,534 113,671 -25.6%
AVTOVAZ 18.4 15.0 3.4 23,639 30,896 -23.5% 16.9 15.2 1.7 41,131 54,543 -24.6%
RENAULT 7.1 8.1 (1.0) 9,100 16,721 -45.6% 7.3 8.2 (0.9) 17,909 29,615 -39.5%
NISSAN 7.4 8.3 (0.9) 9,447 17,158 -44.9% 7.6 7.9 (0.3) 18,548 28,209 -34.2%
INFINITI 0.3 0.4 (0.1) 419 833 -49.7% 0.5 0.4 0.1 1,109 1,304 -15.0%
Datsun 2.3 - - 2,904 - - 2.4 - - 5,837 - -
VW Group 11.1 10.6 0.5 14,188 21,849 -35.1% 11.3 10.5 0.8 27,527 37,836 -27.2%
VOLKSWAGEN cars 4.5 5.5 (1.0) 5,804 11,390 -49.0% 4.9 5.6 (0.7) 11,969 19,989 -40.1%
VOLKSWAGEN vans 0.5 0.5 0.0 672 1,058 -36.5% 0.5 0.6 (0.1) 1,280 2,007 -36.2%
AUDI 1.6 1.4 0.2 2,092 2,905 -28.0% 1.4 1.3 0.1 3,502 4,528 -22.7%
SEAT 0.0 0.1 (0.1) 2 112 -98.2% 0.0 0.1 (0.1) 33 184 -82.1%
ŠKODA 4.4 3.1 1.3 5,618 6,384 -12.0% 4.4 3.1 1.3 10,743 11,128 -3.5%
HYUNDAI 10.3 6.7 3.6 13,233 13,901 -4.8% 10.6 6.9 3.7 25,940 24,945 4.0%
KIA 9.8 6.4 3.4 12,563 13,303 -5.6% 9.8 6.8 3.0 23,909 24,502 -2.4%
TOYOTA Group 6.2 6.1 0.1 7,934 12,606 -37.1% 6.5 6.0 0.5 15,773 21,632 -27.1%
TOYOTA 5.6 5.8 (0.2) 7,143 11,892 -39.9% 5.9 5.6 0.3 14,292 20,211 -29.3%
LEXUS 0.6 0.3 0.3 791 714 10.8% 0.6 0.4 0.2 1,481 1,421 4.2%
MERCEDES-BENZ 3.6 1.9 1.7 4,627 3,999 15.7% 3.3 2.0 1.3 8,126 7,038 15.5%
MERCEDES-BENZ
3.2 1.7 1.5 3.0 1.7 1.3
cars 4,151 3,520 17.9% 7,326 6,230 17.6%
MERCEDES-BENZ
0.3 0.2 0.1 0.3 0.2 0.1
vans 444 459 -3.3% 749 771 -2.9%
smart 0.0 0.0 0.0 32 20 60.0% 0.0 0.0 0.0 51 37 37.8%
GM Group 3.3 9.3 (6.0) 4,201 19,155 -78.1% 3.4 9.2 (5.8) 8,362 32,936 -74.6%
OPEL 0.7 3.2 (2.5) 912 6,610 -86.2% 0.8 3.0 (2.2) 1,985 10,891 -81.8%
CHEVROLET 2.5 6.0 (3.5) 3,255 12,448 -73.9% 2.6 6.1 (3.5) 6,305 21,868 -71.2%
CADILLAC 0.0 0.0 0.0 34 97 -64.9% 0.0 0.0 0.0 72 177 -59.3%
BMW Group 2.9 1.7 1.2 3,666 3,504 4.6% 2.6 1.7 0.9 6,302 6,126 2.9%
BMW 2.8 1.6 1.2 3,550 3,356 5.8% 2.5 1.6 0.9 6,095 5,896 3.4%
MINI 0.1 0.1 0.0 116 148 -21.6% 0.1 0.1 0.0 207 230 -10.0%
MITSUBISHI 2.6 3.3 (0.7) 3,323 6,817 -51.3% 2.7 3.3 (0.6) 6,543 11,824 -44.7%
GAZ LCV 2.3 2.2 0.1 2,970 4,527 -34.4% 2.0 2.2 (0.2) 4,798 7,787 -38.4%
MAZDA 1.9 1.9 0.0 2,381 3,899 -38.9% 2.0 1.9 0.1 4,765 6,747 -29.4%
UAZ 1.8 1.4 0.4 2,260 2,903 -22.1% 1.9 1.4 0.5 4,513 5,104 -11.6%
DAEWOO 1.3 2.2 (0.9) 1,639 4,536 -63.9% 1.5 2.3 (0.8) 3,654 8,254 -55.7%
FORD 1.1 3.1 (2.0) 1,399 6,306 -77.8% 1.3 2.9 (1.6) 3,212 10,556 -69.6%
JAGUAR LAND ROVER 1.0 1.0 0.0 1,258 2,024 -37.8% 0.9 0.8 0.1 2,092 3,040 -31.2%
LAND ROVER 0.9 0.9 0.0 1,183 1,867 -36.6% 0.8 0.8 0.0 1,958 2,789 -29.8%
JAGUAR 0.1 0.1 0.0 75 157 -52.2% 0.1 0.1 0.0 134 251 -46.6%
SUBARU 0.7 0.7 0.0 836 1,374 -39.2% 0.7 0.6 0.1 1,752 2,312 -24.2%
PSA PEUGEOT
0.6 2.2 (1.6) 757 4,546 -83.3% 0.7 2.3 (1.6) 1,655 8,109 -79.6%
CITROЁN
PEUGEOT 0.3 1.1 (0.8) 377 2,354 -84.0% 0.3 1.2 (0.9) 795 4,197 -81.1%
CITROЁN 0.3 1.1 (0.8) 380 2,192 -82.7% 0.4 1.1 (0.7) 860 3,912 -78.0%
VOLVO 0.6 0.6 0.0 757 1,143 -33.8% 0.4 0.4 0.0 1,027 1,545 -33.5%
LIFAN 0.6 0.7 (0.1) 721 1,548 -53.4% 0.6 0.7 (0.1) 1,484 2,666 -44.3%
GEELY 0.5 0.8 (0.3) 681 1,687 -59.6% 0.5 0.8 (0.3) 1,131 2,845 -60.2%
CHRYSLER Group 0.5 0.6 (0.1) 589 1,208 -51.2% 0.4 0.6 (0.2) 1,097 2,044 -46.3%
FIAT 0.3 0.3 0.0 345 581 -40.6% 0.3 0.3 0.0 641 988 -35.1%
CHRYSLER 0.0 0.0 0.0 8 14 -42.9% 0.0 0.0 0.0 12 21 -42.9%
JEEP 0.2 0.3 (0.1) 235 609 -61.4% 0.2 0.3 (0.1) 440 1,029 -57.2%
DODGE - 0.0 - - 4 - - 0.0 - - 6 -
ALFA ROMEO 0.0 - - 1 - - 0.0 - - 4 - -
SSANGYONG 0.4 1.0 (0.6) 561 2,007 -72.0% 0.5 0.9 (0.4) 1,294 3,337 -61.2%
SUZUKI 0.3 0.8 (0.5) 416 1,707 -75.6% 0.4 0.9 (0.5) 871 3,189 -72.7%
CHERY 0.3 0.8 (0.5) 402 1,709 -76.5% 0.3 0.8 (0.5) 770 2,846 -72.9%
GREAT WALL 0.3 0.7 (0.4) 402 1,402 -71.3% 0.3 0.6 (0.3) 807 2,334 -65.4%
PORSCHE 0.3 0.1 0.2 381 174 119.0% 0.2 0.1 0.1 575 300 91.7%
HONDA Group 0.3 1.2 (0.9) 341 2,484 -86.3% 0.3 1.2 (0.9) 798 4,413 -81.9%
HONDA 0.2 1.2 (1.0) 252 2,484 -89.9% 0.3 1.2 (0.9) 636 4,413 -85.6%
ACURA 0.1 - - 89 - - 0.1 - - 162 - -
BRILLIANCE 0.1 - - 144 - - 0.1 - - 241 - -
ISUZU 0.1 0.0 0.1 74 5 1380.0% 0.0 0.0 0.0 103 33 212.1%
JAC 0.0 - - 38 - - 0.0 - - 53 - -
BAW 0.0 0.1 (0.1) 24 118 -79.7% 0.0 0.1 (0.1) 53 231 -77.1%
HAIMA 0.0 0.0 0.0 20 21 -4.8% 0.0 0.0 0.0 61 41 48.8%
FOTON 0.0 0.0 0.0 3 3 0.0% 0.0 0.0 0.0 4 5 -20.0%
CHANGAN - - - - 50 - - - - - 50 -
LUXGEN - 0.0 - - 15 - - - - - 27 -
TAGAZ - 0.0 - - 22 - - 0.0 - - 28 -
FAW - 0.1 - - 234 - - 0.1 - - 536 -
ZAZ - 0.1 - - 113 - - 0.1 - - 214 -
IZH - 0.0 - - 5 - - 0.0 - - 15 -
BOGDAN - 0.0 - - 14 - - 0.0 - - 70 -
"""
Вот это подарочек! Что со строками? Оказывается - конвертер сработал хорошо, именно так и в оригинальном файле:
Image('/home/kiss/Desktop/Screenshot from 2015-04-28 10:42:44.png')
Обратите внимание, строки идут "лестницей"... Конвертер еще добавил сюда пустые строки:
MERCEDES-BENZ 3.6 1.9 1.7 4,627 3,999 15.7% 3.3 2.0 1.3 8,126 7,038 15.5%
MERCEDES-BENZ
3.2 1.7 1.5 3.0 1.7 1.3
cars 4,151 3,520 17.9% 7,326 6,230 17.6%
MERCEDES-BENZ
0.3 0.2 0.1 0.3 0.2 0.1
vans 444 459 -3.3% 749 771 -2.9%
smart 0.0 0.0 0.0 32 20 60.0% 0.0 0.0 0.0 51 37 37.8%
pdt3 =""""
1 Granta Lada 10,583 11,280 (697) 1 Granta Lada 18,320 19,535 (1,215)
2 Solaris Hyundai 8,001 8,660 (659) 2 Solaris Hyundai 16,218 15,607 611
3 New Rio KIA 6,059 5,874 185 3 New Rio KIA 11,236 11,198 38
4 4x4 Lada 3,779 3,148 631 4 Logan Renault 6,790 6,792 (2)
5 Largus Lada 3,443 4,792 (1,349) 5 4x4 Lada 6,727 5,462 1,265
6 Logan Renault 3,424 3,788 (364) 6 Polo VW 5,927 8,941 (3,014)
7 Duster Renault 2,951 7,541 (4,590) 7 Duster Renault 5,694 13,131 (7,437)
8 Priora Lada 2,740 4,090 (1,350) 8 on-DO Datsun 5,548 - -
9 Camry Toyota 2,718 2,870 (152) 9 Largus Lada 5,346 8,584 (3,238)
10 ix35 Hyundai 2,681 2,733 (52) 10 Kalina Lada 5,184 10,450 (5,266)
11 Kalina Lada 2,658 6,186 (3,528) 11 Camry Toyota 4,827 4,399 428
12 on-DO Datsun 2,615 - - 12 ix35 Hyundai 4,760 5,078 (318)
13 Polo VW 2,603 5,105 (2,502) 13 Priora Lada 4,730 7,414 (2,684)
14 Almera Nissan 2,464 4,481 (2,017) 14 Almera Nissan 4,725 7,474 (2,749)
15 Niva Chevrolet 2,394 3,625 (1,231) 15 Sandero Renault 4,408 6,386 (1,978)
16 Rapid Skoda 2,250 - - 16 Niva Chevrolet 4,391 6,247 (1,856)
17 Sandero Renault 2,242 3,591 (1,349) 17 Rapid Skoda 4,198 - -
18 Octavia A7 Skoda 2,135 3,028 (893) 18 Octavia A7 Skoda 4,129 5,467 (1,338)
19 New Cee'd KIA 2,093 1,758 335 19 RAV 4 Toyota 3,420 4,817 (1,397)
20 Juke Nissan 1,746 2,295 (549) 20 New Cee'd KIA 3,395 4,023 (628)
21 Qashqai Nissan 1,446 2,860 (1,414) 21 Qashqai Nissan 3,352 5,012 (1,660)
New
22 ASX Mitsubishi 1,413 2,175 (762) 22 KIA 2,906 790 2,116
Sorento
23 CX-5 Mazda 1,400 1,770 (370) 23 ASX Mitsubishi 2,877 3,648 (771)
24 RAV 4 Toyota 1,378 2,537 (1,159) 24 Juke Nissan 2,788 3,512 (724)
New
25 KIA 1,329 490 839 25 Sportage KIA 2,743 5,273 (2,530)
"""
А здесь что-то пошло не так после строки 21. Для полноты картины просто скопипастим эти таблицы и PDF файла, а потом добавим скриншот проблемных фрагментов.
1 Granta Lada 10,583 11,280 (697) 1 Granta Lada 18,320 19,535 (1,215)
2 Solaris Hyundai 8,001 8,660 (659) 2 Solaris Hyundai 16,218 15,607 611
3 New Rio KIA 6,059 5,874 185 3 New Rio KIA 11,236 11,198 38
4 4x4 Lada 3,779 3,148 631 4 Logan Renault 6,790 6,792 (2)
5 Largus Lada 3,443 4,792 (1,349) 5 4x4 Lada 6,727 5,462 1,265
6 Logan Renault 3,424 3,788 (364) 6 Polo VW 5,927 8,941 (3,014)
7 Duster Renault 2,951 7,541 (4,590) 7 Duster Renault 5,694 13,131 (7,437)
8 Priora Lada 2,740 4,090 (1,350) 8 on-DO Datsun 5,548 - -
9 Camry Toyota 2,718 2,870 (152) 9 Largus Lada 5,346 8,584 (3,238)
10 ix35 Hyundai 2,681 2,733 (52) 10 Kalina Lada 5,184 10,450 (5,266)
11 Kalina Lada 2,658 6,186 (3,528) 11 Camry Toyota 4,827 4,399 428
12 on-DO Datsun 2,615 - - 12 ix35 Hyundai 4,760 5,078 (318)
13 Polo VW 2,603 5,105 (2,502) 13 Priora Lada 4,730 7,414 (2,684)
14 Almera Nissan 2,464 4,481 (2,017) 14 Almera Nissan 4,725 7,474 (2,749)
15 Niva Chevrolet 2,394 3,625 (1,231) 15 Sandero Renault 4,408 6,386 (1,978)
16 Rapid Skoda 2,250 - - 16 Niva Chevrolet 4,391 6,247 (1,856)
17 Sandero Renault 2,242 3,591 (1,349) 17 Rapid Skoda 4,198 - -
18 Octavia A7 Skoda 2,135 3,028 (893) 18 Octavia A7 Skoda 4,129 5,467 (1,338)
19 New Cee'd KIA 2,093 1,758 335 19 RAV 4 Toyota 3,420 4,817 (1,397)
20 Juke Nissan 1,746 2,295 (549) 20 New Cee'd KIA 3,395 4,023 (628)
21 Qashqai Nissan 1,446 2,860 (1,414) 21 Nissan 3,352 5,012 (1,660)
22 ASX Mitsubishi 1,413 2,175 (762) 22 KIA 2,906 790 2,116
23 CX-5 Mazda 1,400 1,770 (370) 23 Qashqai Mitsubishi 2,877 3,648 (771)
New
Sorento
ASX
24 RAV 4 Toyota 1,378 2,537 (1,159) 24 Juke Nissan 2,788 3,512 (724)
New
Sorento
KIA 1,329 490 839 25 Sportage KIA 2,743 5,273 (2,530)
25
Здесь после строки 23 явно виден "сбой". Если открыть исходный pdf файл и просто скопипастить данные, начиная со строки "23 CX-5 ...", то после перехода курсора на вторую строчку в левой таблице, в правой выделятся ячейки вот так:
from IPython.display import Image
Image('/home/kiss/Desktop/Screenshot from 2015-04-28 10:20:39.png')
Мы не знаем, как и из чего (какой) конвертер создавал этот pdf файл. Так что надежда только на то, что наш конвертер pdftotext "исправит" ситуацию. Здесь в Linux не исправил, надо попробовать в Windows, там есть опция -table
Однако, если мы вернемся к таблице выше (после конвертера), то порадуемся тому, что конвертер споткнулся только на одной ячейке:
New
Sorento
По сути, он (конвертер) сработал отлично. Вставил "New" выше, а "Sorento" ниже "KIA ...". Так и получились лишние две строки... в районе 23 номера... И последняя 25 тоже со вставками, причем я еще и потерял последнее слово "Sorento" при копипасте.
Посты чуть ниже также могут вас заинтересовать
Комментариев нет:
Отправить комментарий