web-dev-qa-db-fra.com

Création d'une table CSV à partir d'une image

Quelles sont les options Ubuntu pour créer des tables CSV à partir d'une image:

table of figures

Idéalement, les options seraient simples et rapides. L'image provient de courbe de rendement article

4
gatorback

J'ai écrit un petit script Python qui peut faire ce que vous voulez.

Pour la partie OCR, vous auriez besoin de tesseract. Vous pouvez l'installer en cours d'exécution:

Sudo apt install tesseract-ocr

Ensuite, exécutez tesseract pour créer un fichier txt avec les données de lecture d'image. Je nomme ce fichier tesseract_output (tesseract ajoutera le .txt extension), vous pouvez le nommer comme vous le souhaitez.

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

Copiez et collez ensuite le script suivant et enregistrez-le dans un fichier se terminant par .py (par exemple 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])

Pour que le script fonctionne, vous devez saisir les informations suivantes dans la section USER INPUT:

  • input_file: le chemin complet vers la sortie tesseract.

  • output_file: le chemin complet vers le fichier csv final.

  • rows: le nombre de lignes du tableau. Dans votre exemple d'image, c'est 10.

  • delimiter: le délimiteur à utiliser dans le csv. Ici, j'utilise ;. Vous pouvez utiliser n'importe quelle chaîne de 1 caractère dont vous avez besoin.

Exécutez le fichier:

python /path/to/your/script.py

Vous devriez maintenant avoir un csv avec le contenu suivant:

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

PRUDENCE

Comme vous pouvez le voir, le résultat est satisfaisant, mais dépend de la sortie de tesseract. Il est presque certain que tesseract ne détectera pas tout correctement, comme vous pouvez facilement le voir dans la sortie csv. Vous devrez comparer les résultats avec l'image d'origine et les corriger manuellement, soit dans la sortie tesseract ou dans la sortie csv à la fin.

De plus, dans le script, je m'occupe des espaces vides et des retours à la ligne redondants que tesseract recrache, ce qui fonctionne bien pour votre exemple d'image. Cependant, si une cellule de tableau était vide, elle serait complètement supprimée, détruisant efficacement toute la structure du tableau. Dans ce cas, si j'étais vous, je modifierais le tesseract_output.txt fichier et modifiez manuellement les cellules vides en contenant un -, il ne sera donc pas supprimé.

3
user3140225