LINUX.ORG.RU

Конвертация таблицы из PDF(TXT) в CSV

 , ,


0

3

Есть задача, преобразования PDF-ки, которая представляет из себя большую таблицу, в CSV. С помощью pdftotext переконвертировал в текстовый файл, sed-ом подрезал лишний мусор в шапке, в заголовках страниц, остались голые данные. Дальше есть небольшая сложность, в оригинальном PDF, ячейка с отчеством была с переносом строки,

-----------------------------------------------
|1     |ГУРЦКАЯ |ОЛЬГА |ВЛАДИМИРОВ |21.03.1982|
|      |        |      |НА         |          |
|      |        |      |           |          |
-----------------------------------------------
|2     |АБАШИДЗЕ|ФАИК  |           |17.03.1951|
|      |        |      |           |          |
|      |        |      |           |          |
-----------------------------------------------

т.е. на примере первой строки отчество (3 колонка) «Владимировна» в текстовом файле оказалась «Владимиров» на первой строке, а «на» уже на другой строке.

Каким образом можно эти переносы «приклеить» назад к своим начальным частям, чтобы дальше уже с помощью какого-нибудь tr заменить пробел(ы) на ";" и получить нормальный файл с разделителями? Сейчас имеем такого рода файл:

1        ГУРЦКАЯ             ОЛЬГА       ВЛАДИМИРОВ 21.03.1982         8 д.            ПВДНП           23.05.2019       1/1                ЗП: Взр
                                       НА                                            изготовлен
2        АБАШИДЗЕ          ФАИК                    17.03.1951      7 д.            Сформирована    21.05.2019       3/4                ЗП: Взр
3        АБРАМОВА          ТАТЬЯНА     СВЯТОСЛАВОВ 10.11.1977        8 д.            ПВДНП           23.05.2019       1/1                ЗП: Взр
                                       НА                                            изготовлен
4        АЛЕКСЕЕНКОВА      АЛИНА        ИВАНОВНА      21.03.1977      10 д.           ПВДНП           23.05.2019       1/1                ЗП: Взр
                                                                                     изготовлен
5        АЛЕЩЕНКОВА        ВАЛЕНТИНА      КОНСТАНТИН    09.02.1955      8 д.            ПВДНП           23.05.2019       1/1                ЗП: Взр
                                       ОВНА                                          изготовлен
6        АНДОРСКАЯ         ЕКАТЕРИНА   ВИКТОРОВНА    18.03.1993      10 д.           ПВДНП           23.05.2019       1/1                ЗП: Взр
                                                                                     изготовлен


Правильные регулярки сам допишешь.

s = """
1        ГУРЦКАЯ             ОЛЬГА       ВЛАДИМИРОВ 21.03.1982         8 д.            ПВДНП           23.05.2019       1/1                ЗП: Взр    
                                       НА                                            изготовлен
2        АБАШИДЗЕ          ФАИК                    17.03.1951      7 д.            Сформирована    21.05.2019       3/4                ЗП: Взр
3        АБРАМОВА          ТАТЬЯНА     СВЯТОСЛАВОВ 10.11.1977        8 д.            ПВДНП           23.05.2019       1/1                ЗП: Взр    
                                       НА                                            изготовлен
4        АЛЕКСЕЕНКОВА      АЛИНА        ИВАНОВНА      21.03.1977      10 д.           ПВДНП           23.05.2019       1/1                ЗП: Взр
                                                                                     изготовлен
5        АЛЕЩЕНКОВА        ВАЛЕНТИНА      КОНСТАНТИН    09.02.1955      8 д.            ПВДНП           23.05.2019       1/1                ЗП: Взр
                                       ОВНА                                          изготовлен
6        АНДОРСКАЯ         ЕКАТЕРИНА   ВИКТОРОВНА    18.03.1993      10 д.           ПВДНП           23.05.2019       1/1                ЗП: Взр
                                                                                     изготовлен

"""

import re

lines = s.splitlines()[1:]

table_rows = []
new_row = None


for line in lines:
    if re.match('^\d', line):
        if new_row:
            table_rows.append(new_row)
        new_row = [line]
    else:
        new_row.append(line)



for row in table_rows:
    first_line = row[0]
    additional_lines = row[1:]
    
    matches = re.finditer('[^\s].+?(?:\s{4,}|$)', first_line)
    cells = [[match] for match in matches]
    
    for line in additional_lines:
        rest_matches = re.finditer('[^\s].+?\s{4,}', line)            
        for rest_match in rest_matches:
            for cell in cells:
                if rest_match.start() < cell[0].start() + len(cell[0].group().rstrip()):
                    cell.append(rest_match)
                    break
                
    cells = [''.join(match.group().strip() for match in cell) for cell in cells]
    print(cells)

anonymous
()
Ответ на: комментарий от theNamelessOne

Зачастую там разные строки разными текстовыми слоями сделаны, визуально выглядит правильно, а если мышкой выделять - то подсвечиваются как идущие подряд слова в совершенно разных местах страницы.

PDF - говно, а не формат.

legolegs ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.