#python #python-3.x #string #dataframe #ocr
Вопрос:
Я извлек табличную информацию из отсканированного изображения(см. скриншот выше) и получил вывод в виде строки.
Вот результат
Payment Date: 9/14/2020 Reference: 0000232954
Invoice Number Invoice Date Voucher [ID Gross Amount Discounts Late Charges Paid Amount
102554463001 Jul/062020 21002450 699.86 0.00 0.00 699.86
112942431001 Aug/12/2020 21002565 875.96 0.00 0,00 875.96
Vendor Number Name Bank Charge Transfer Cost Cd
1000028351 OFFICE DEPOT INC $0.00
Reference Date Total Gross Amt Total Discounts Totul Late Charges Total Paid Amt
0000232954 Sep/14/2020 $1,575.82 $0.00 $0.00 $1,575.82
Приведенный выше вывод представляет собой строку, в которой данные не выровнены, я ищу решение, в котором я могу хранить данные во фрейме данных или на листе Excel.
Названия столбцов на приведенном выше изображении можно интерпретировать как [Номер счета, Дата выставления счета, Идентификатор Ваучера, Общая сумма, Скидки, Просроченные платежи, Оплаченная сумма]
С нетерпением ждем вашей помощи!
Комментарии:
1. Попробуйте изменить имена столбцов, чтобы между ними не было пробелов (например, Номер счета-фактуры). Как только это будет сделано, вы можете использовать пробел в качестве разделителя и использовать excel или pandas для загрузки в табличном виде.
2. Является ли каждая из строк строкой или вы несете все в одной строке?
3. все в одной строке
4. поделитесь строкой, из которой вы хотите извлечь данные
5. Вот строка:- Дата оплаты: 14/14/2020 Ссылка: 0000232954 Номер счета-фактуры Дата выставления счета-фактуры Ваучер [ИДЕНТИФИКАТОР Валовой суммы Скидки Сумма просроченных платежей 102554463001 июля/062020 21002450 699.86 0.00 0.00 699.86 112942431001 Август/12/2020 21002565 875.96 0.00 0,00 875.96 Номер Поставщика Имя Банковский Перевод Стоимость Cd 1000028351 OFFICE DEPOT INC. 0.00 Долл. США Дата Обращения Итого Брутто Amt Итого Скидки Итого Просроченные Платежи Итого Оплачено Amt 0000232954 Сентябрь/14/2020 $1,575.82 $0.00 $0.00 $1,575.82
Ответ №1:
Вы можете использовать регулярные выражения для анализа текстового документа. Например:
import re
import pandas as pd
txt = """
Payment Date: 9/14/2020 Reference: 0000232954
Invoice Number Invoice Date Voucher [ID Gross Amount Discounts Late Charges Paid Amount
102554463001 Jul/062020 21002450 699.86 0.00 0.00 699.86
112942431001 Aug/12/2020 21002565 875.96 0.00 0,00 875.96
Vendor Number Name Bank Charge Transfer Cost Cd
1000028351 OFFICE DEPOT INC $0.00
Reference Date Total Gross Amt Total Discounts Totul Late Charges Total Paid Amt
0000232954 Sep/14/2020 $1,575.82 $0.00 $0.00 $1,575.82
"""
pat_payment_date = re.compile(r"Payment Date:s*(S )")
pat_reference = re.compile(r"Reference:s*(S )")
pat_items = re.compile(
r"^(d )s (S )s (d )s ([d,.] )s ([d,.] )s ([d,.] )s ([d,.] )",
flags=re.M,
)
pat_vendor = re.compile(
r"^Vendor.*?n^(d )s (.*?)s ([$d,.] )", flags=re.M | re.S
)
pat_last = re.compile(
r"^Reference.*?n^(d )s (S )s ([$d,.] )s ([$d,.] )s ([$d,.] )s ([$d,.] )",
flags=re.M | re.S,
)
data = {}
for row in pat_payment_date.findall(txt):
data["Payment Date"] = row
for row in pat_reference.findall(txt):
data["Reference"] = row
for row in pat_items.findall(txt):
data.setdefault("Items", []).append(list(row))
for row in pat_vendor.findall(txt):
data["Vendor"] = list(row)
for row in pat_last.findall(txt):
data["Total"] = list(row)
df = pd.DataFrame([data]).explode("Items")
print(df)
С принтами:
Payment Date Reference Items Vendor Total
0 9/14/2020 0000232954 [102554463001, Jul/062020, 21002450, 699.86, 0.00, 0.00, 699.86] [1000028351, OFFICE DEPOT INC, $0.00] [0000232954, Sep/14/2020, $1,575.82, $0.00, $0.00, $1,575.82]
0 9/14/2020 0000232954 [112942431001, Aug/12/2020, 21002565, 875.96, 0.00, 0,00, 875.96] [1000028351, OFFICE DEPOT INC, $0.00] [0000232954, Sep/14/2020, $1,575.82, $0.00, $0.00, $1,575.82]
Чтобы создать столбцы из списка, вы можете сделать это:
cols = [
"invoice_number",
"invoice_date",
"voucher_id",
"gross_amount",
"discounts",
"late_charges",
"paid_amount",
]
df = pd.concat(
[
df,
df.pop("Items")
.apply(lambda x: {c: v for v, c in zip(x, cols)})
.apply(pd.Series),
],
axis=1,
)
print(df)
С принтами:
Payment Date Reference Vendor Total invoice_number invoice_date voucher_id gross_amount discounts late_charges paid_amount
0 9/14/2020 0000232954 [1000028351, OFFICE DEPOT INC, $0.00] [0000232954, Sep/14/2020, $1,575.82, $0.00, $0.00, $1,575.82] 102554463001 Jul/062020 21002450 699.86 0.00 0.00 699.86
0 9/14/2020 0000232954 [1000028351, OFFICE DEPOT INC, $0.00] [0000232954, Sep/14/2020, $1,575.82, $0.00, $0.00, $1,575.82] 112942431001 Aug/12/2020 21002565 875.96 0.00 0,00 875.96