答案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])
为了使脚本正常工作,您必须在用户输入部分输入以下内容:
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
并手动将空单元格更改为包含-
,这样它就不会被删除。