Заменить разделитель табуляции на другой символ - PullRequest
1 голос
/ 14 октября 2019

Мне нужно собрать некоторые данные из PDF-файла и ввести их в файл Excel, но для создания макроса для организации ячеек мне нужен символ, отличный от ", ". Потому что некоторые ценностные данные нуждаются в "," для центов. Есть идеи ? (Символ типа "/" или "-" решит проблему)

Когда я конвертирую свой PDF в CSV, все данные помещаются в одну ячейку, поэтому мне нужно использовать макрос. Как мои данные организованы в Excel

from tabula import read_pdf
from tabula import convert_into
convert_into("B.pdf", "BBBBB.csv", output_format="csv", pages=1,coding = 'latin-1',stream=True, guess = False ,
         area = (306.9,253,379,570),
         columns = (347,399.1,443.4,481.6,514.3,543.5,572))

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Если вы хотите продолжать использовать convert_into, вы можете установить output_format="tsv", который преобразует таблицу в формат с разделителями табуляции. https://tabula -py.readthedocs.io / en / latest / tabula.html # tabula.wrapper.convert_into Кроме этого, вы можете преобразовать в DataFrame с помощью read_csv, а затем использовать df.to_csv с установкой разделителя.

0 голосов
/ 14 октября 2019

"," внутри значений данных правильно экранируются внутри " " маркеров и будут просто работать. Что неправильно, так это ваш Excel, который не использует , в качестве разделителя полей. IIRC, вы можете преодолеть это на стороне Excel, используя File->import вместо того, чтобы просто пытаться открыть файл CSV. Таким образом, Excel запросит у вас параметры CSV.

В противном случае параметр средства записи CSV в Python для изменения символа разделителя является в точности «разделителем» -

К сожалению, Tabula-py - это просто оболочка вокругtabula-java вызывается через внешний процесс, и в нем нет опции для изменения символа разделителя. В противном случае, это будет вопрос добавления параметра delimiter=... к вашему вызову.

Однако, как представляется, это самый простой способ - повторно преобразовать файл CSV, созданный на стороне Java. одному с ";"разделители после извлечения данных:

(в примере имеется довольно полная функция-обертка, но преобразование происходит только в четырех строках кода в конце)


import csv
from pathlib import Path
from tabula import read_pdf
from tabula import convert_into


def convert(input_file, output_file, encoding="latin1", area=None, columns=None, delimiter=";"):
    if area is None:
        area = (306.9, 253, 379, 570)
    if columns is None:
        columns = (347, 399.1, 443.4, 481.6, 514.3, 543.5, 572)

    if delimiter != ",":
        final_output = Path(output_file)
        # temporary name
        output_file = final_output.parent / (final_output.stem + "_tmp" + final_output.suffix)

    # perform the actual data extraction and CSV output
    convert_into(
        input_file,
        output_file,
        output_format="csv",
        pages=1,
        coding="latin-1",
        stream=True,
        guess=False,
        area=area,
        columns=columns,
    )

    if delimiter != ",":
        # if needed, convert the CSV file to use the required delimiters:
        try:
            with open(output_file) as tabula_csv, open(final_output) as final_csv:
                reader = csv.reader(tabula_csv)
                writer = csv.writer(final_csv, delimiter=delimiter)
                writer.writerows(reader)
        else:

            # if everything was ok on conversion, remove temporary file:
            output_file.unlink()
...