Как я могу сгруппировать строки в текстовом файле на основе содержимого каждой строки? - PullRequest
0 голосов
/ 27 июня 2019

Предположим, у меня есть текстовый файл, содержащий следующее:

12277   17/06/2019  350 BJ201AB FMACRI                  
                    0   J   52  4081.15 166851
                    0   J   52  4496.64 166852
                    0   J   52  5139.07 166855
                    0   J   52  5773.82 166858
                    J   E   70  25  B159681
12509   21/06/2019  443 DH717WF BLANCO                  
                    B   J   42  5376.63 5164/A
12504   21/06/2019  443 EB631NF LUCCIG                  
                    B   J   44  5567.46 5165/A
                    0   J   52  5347.58 166950
                    0   J   52  4742.4  166953
                    0   J   18  1146.24 427876
                    0   J   4   0.4 427877
                    J   0   372 1   B159763
                    R   0   1567    1   B159764

Предполагая, что я прочитаю файл так:

with open('/home/pexp1/mezzi/INPUT') as f:
    lines = f.readlines()
data = [(line.rstrip()).split('\t') for line in lines]

Каков будет правильный подход к группировке каждой строки, начинающейся с чего-либо (целое число, строка и т. Д.), С каждой второй строкой под ней, до тех пор, пока не будет найдена новая строка, соответствующая указанному выше правилу? Предполагая, что я хотел бы позвонить на линию, которая соблюдает правило, и получить все в своей группе, какую структуру данных будет лучше объединить в одну строку?

РЕДАКТИРОВАТЬ: Извинения за отсутствие ясности. Если я запускаю приведенный выше код, я получаю это при запуске print(data):

[
    ['12277', '17/06/2019', '350', 'BJ201AB', 'FMACRI'],
    ['', '', '', '', '', '0', 'J', '52', '4081.15', '166851'],
    ['', '', '', '', '', '0', 'J', '52', '4496.64', '166852'],
    ['', '', '', '', '', '0', 'J', '52', '5139.07', '166855'],
    ['', '', '', '', '', '0', 'J', '52', '5773.82', '166858'],
    ['', '', '', '', '', 'J', 'E', '70', '25', 'B159681'],
    ['12509', '21/06/2019', '443', 'DH717WF', 'BLANCO'],
    ['', '', '', '', '', 'B', 'J', '42', '5376.63', '5164/A'],
    ['12504', '21/06/2019', '443', 'EB631NF', 'LUCCIG'],
    ['', '', '', '', '', 'B', 'J', '44', '5567.46', '5165/A'],
    ...
]

Как видите, это список списков. Как я могу сгруппировать эти элементы вместе, чтобы списки, которые содержали элемент в позиции индекса 0 (в данном случае 12277, 122509 и т. Д.), Группировались вместе со списками, которые следуйте ниже (без элементов с указателем поз. 0, 1, 2, 3, 4)?

Пример:

['12277', '17/06/2019', '350', 'BJ201AB', 'FMACRI']

сгруппированы с ['', '', '', '', '', '0', 'J', '52', '4081.15', '166851'], ['', '', '', '', '', '0', 'J', '52', '4496.64', '166852'] и т. Д. До следующей строки, содержащей элемент с индексом 0: ['12509', '21/06/2019', '443', 'DH717WF', 'BLANCO']

РЕДАКТИРОВАТЬ2: Это решение, которое я придумал:

shipments = []
shuttle_lst = []

for line in data[1:]:
    if len(line[0]) < 1:
        shipments.append(line)
    else:
        shuttle = data[data.index(line) - (len(shipments) + 1)]
        shipments.append(shuttle)
        new_lst = [lst for lst in shipments]
        shuttle_lst.append(new_lst)
        shipments.clear()

Это создает список списков, где каждый заголовок становится последним элементом этого списка.

1 Ответ

1 голос
/ 27 июня 2019

Если я правильно понимаю, вы хотите сгруппировать строки на основе строки заголовка, которая не начинается с пробела, верно?

Обратите внимание на следующее:

import pprint
pp = pprint.PrettyPrinter(indent=4)

# A list of lists
data = []

with open('data.dat') as f:
    for line in f:
        if line.startswith(" ") or line.startswith("\t"):
            if not data:
                raise RuntimeError("Wrong data - first line is not legit")
            data[-1].append(line.split())
            continue

        # If here, this is a header line
        data.append([line.split()])

pp.pprint(data)

Это печатает:

[   [   ['12277', '17/06/2019', '350', 'BJ201AB', 'FMACRI'],
        ['0', 'J', '52', '4081.15', '166851'],
        ['0', 'J', '52', '4496.64', '166852'],
        ['0', 'J', '52', '5139.07', '166855'],
        ['0', 'J', '52', '5773.82', '166858'],
        ['J', 'E', '70', '25', 'B159681']],
    [   ['12509', '21/06/2019', '443', 'DH717WF', 'BLANCO'],
        ['B', 'J', '42', '5376.63', '5164/A']],
    [   ['12504', '21/06/2019', '443', 'EB631NF', 'LUCCIG'],
        ['B', 'J', '44', '5567.46', '5165/A'],
        ['0', 'J', '52', '5347.58', '166950'],
        ['0', 'J', '52', '4742.4', '166953'],
        ['0', 'J', '18', '1146.24', '427876'],
        ['0', 'J', '4', '0.4', '427877'],
        ['J', '0', '372', '1', 'B159763'],
        ['R', '0', '1567', '1', 'B159764']]]

Результатом является список списков (списков!). Каждый первый элемент списка 2-го уровня является строкой заголовка, а остальные строки в этой группе

...