Как извлечь фрейм данных из файла .csv. который содержит строки сведений заголовка с использованием Python - PullRequest
0 голосов
/ 07 августа 2020

У меня есть файл, из которого я пытаюсь извлечь значения, чтобы создать фрейм данных. Я пробовал подход с использованием регулярных выражений для создания списков из файла, но формат данных (заголовок / 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

Буду признателен за ваш добрый совет.

1 Ответ

0 голосов
/ 07 августа 2020

Попробуйте следующее:

regex = r"[H,D] (?P<invoice_nr>[^,]*)(, (?P<date>[^,]*)[\s\S]*?(?P<quantity>-?\d+\.00), IN)[\s\S]*?(\n|$)"

Я сделал вам пример здесь , не уверен, поможет ли это, но он должен дать вам несколько указателей на регулярное выражение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...