Создание таблицы CSV из изображения

Каковы варианты Ubuntu для создания таблиц CSV из изображения:

table of figures

В идеале, варианты должны быть простыми и быстрыми. Изображение взято из Кривая доходности , статья

4
задан 17 August 2019 в 12:47

1 ответ

Я записал маленький сценарий Python, который может сделать то, что Вы хотите.

Для части OCR Вам было бы нужно tesseract. Можно установить его выполнение:

sudo apt install tesseract-ocr

Затем выполненный tesseract создать txt файл со считанными из изображения данными. Я называю этот файл tesseract_output (tesseract добавит .txt расширение), можно назвать его, как Вы желаете.

tesseract /path/to/image /path/to/tesseract_output

Затем скопируйте и вставьте следующий сценарий и сохраните его в файл, заканчивающийся .py (например, script.py).

import csv

def split_list(l, n):
    """Split list l in size-n lists.
    Returns a list containing the size-n lists.
    """
    splitted = []

    for i in range(0, len(l), n):
        splitted.append(l[i:i + n])

    return splitted

######################   USER INPUT   ######################
input_file = '/path/to/tesseract_output.txt'
output_file = '/path/to/table.csv'
rows = 10
delimiter = ';'
############################################################

# read input file
with open(input_file, 'r') as f:
    data = f.readlines()

# remove trailing whitespace and newlines
data = list(map(lambda x: x.strip(), data))
# remove empty elements 
data = list(filter(None, data))
# split data to rows-sized lists
data = split_list(data, rows)
# shape data
data = list(map(list, zip(*data)))

# write to csv
with open(output_file, 'w', newline='\n') as f:
    wr = csv.writer(f, delimiter=delimiter)
    for i in range(len(data)):
        wr.writerow(data[i])

Чтобы сценарий работал, необходимо ввести следующее в раздел USER INPUT:

  • input_file: полный путь к tesseract вывод.

  • output_file: полный путь к заключительному файлу CSV.

  • rows: количество строк таблицы. В Вашем изображении в качестве примера это 10.

  • delimiter: разделитель, который будет использоваться в csv. Здесь я использую ;. Можно использовать любую 1 символьную строку, в которой Вы нуждаетесь.

Петляйте:

python /path/to/your/script.py

У Вас должен теперь быть csv со следующим содержанием:

Date;1Mo;2Mo;3Mo;6 Mo;4Yr;2Yr;3Yr;5Yr;TYr;10 Yr;20Yr;30 Yr
08/01/19;2.14;214;2.07;2.04;1.88;1.73;1.67;1.68;177;1.90;2.21;2.44
08/02/19;2.44;2.12;2.08;2.02;1.85;1.72;1.67;1.66;1.75;1.86;2.16;2.39
08/05/19;2.07;2.08;2.05;1.99;1.78;1.59;1.55;1.55;1.63;1.75;2.07;2.30
08/06/19;2.05;2.08;2.05;2.00;1.80;1.60;1.54;1.53;1.62;1.73;2.03;2.25
08/07/19;2.02;2.04;2.02;1.95;1.75;1.59;1.51;1.52;1.60;171;2.01;2.22
08/08/19;2.09;2.07;2.02;1.96;1.79;1.62;1.54;1.54;1.62;1.72;2.02;2.25
08/09/19;2.05;2.06;2.00;1.95;1.78;1.63;1.58;1.57;1.65;174;2.03;2.26
08/12/19;2.09;2.06;2.00;1.94;1.75;1.58;1.51;1.49;1.56;1.65;1.92;2.14
08/13/19;2.05;2.04;2.00;1.96;1.86;1.66;1.60;1.57;1.62;1.68;1.94;2.15

Внимание

Как Вы видите, результат является удовлетворительным, но зависит от tesseractвывод. Это почти бесспорно это tesseract не обнаружит все правильно, как можно легко видеть в выводе csv. Необходимо будет сравнить результаты с исходным изображением и зафиксировать их вручную, или в выводе tesseract или в выводе csv в конце.

Кроме того, в сценарии я забочусь о запаздывающем пробеле и избыточных новых строках это tesseract выкладывает, который хорошо работает для Вашего изображения в качестве примера. Однако, если бы ячейка таблицы была пуста, то она была бы полностью удалена, эффективно уничтожив целую структуру таблицы. В этом случае, на вашем месте, я отредактировал бы tesseract_output.txt файл и вручную изменяет пустые ячейки на содержание a -, таким образом, это не удалить.

3
ответ дан 1 December 2019 в 09:59

Другие вопросы по тегам:

Похожие вопросы: