Каковы варианты Ubuntu для создания таблиц CSV из изображения:
В идеале, варианты должны быть простыми и быстрыми. Изображение взято из Кривая доходности , статья
Я записал маленький сценарий 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 -
, таким образом, это не удалить.