У меня есть файл, из которого я пытаюсь извлечь значения, чтобы создать фрейм данных. Я пробовал подход с использованием регулярных выражений для создания списков из файла, но формат данных (заголовок / H и деталь / D), как показано ниже, дает мне несогласованное количество строк, когда я ввожу результирующие списки во фрейм данных. Я думаю, проблема в том, что в некоторых записях есть одна строка деталей (D), а в других - более одной строки (D). Не могли бы вы предложить другой подход? Я думал о попытке создать объект словаря, где каждая строка H была бы ключом, а каждая строка D была бы значением, используя для l oop какого-то типа.
Формат файла следующий :
H, INV34801, 20200201, 09:18:55, IN, 5 D, INV34801, 0053, 1.00, IN, 20200201, 09:18:55, H, INV34802, 20200201, 10:12:35, IN, 5 D, INV34802, D22345433DU, -1,00, IN, 20200201, 10:12:35, D, INV34802`` 1.00, IN, 20200201, 10: 12: 35,
Это код, который я пробовал:
import pandas as pd
import re
import itertools
#First I extract the date that each sale took place.
lst1= [line for line in re.findall(('[IN, ]\d\d\d\d\d\d\d\d'), contents)]
#Now I remove every alternate date to remove the duplicate date I can confirm seeing that the
#date column has the same number of rows as the Invoice Number column
lst1=lst1[1::2]
#Now I extract the invoice number
lst2= [line for line in re.findall("INV\w*",contents)]
# Now I extract the product codes
lst3=[line for line in
re.findall(('\s\s\s\s\s\w\w\w\w\w\w\w\w\w\w\w|\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s|\n
\s\s\s\s\s\s\s\s\s\s\s\s\d\d\d\d|\s\s\s\s\s\s\s\s\s\s\d\d\d\d\d\d'),contents)]
#Now I extract the Quantity Sold
lst4=[line for line in re.findall(('\s\s\s\s\s\s\d\.\d\d'),contents)]
#then I create a column from the list of Invoice numbers
df=pd.DataFrame([lst1,lst2,lst3,lst4])
df =df.transpose()
df.columns=['Date','Invoice_Number','Product_Code','Quantity']
print(df)
'''
Структура вывода, которую я получаю, верна, но количество и коды продуктов не соответствуют правильным номерам счетов.
Данные ниже:
Date Invoice_Number Product_Code Quantity
0 20200201 INV34801 1.00
1 20200201 INV34802 1.00
2 20200201 INV34803 1.00
3 20200201 INV34804 1.00
4 20200201 INV34805 8.00
Буду признателен за ваш добрый совет.