лучшие инструменты для синтаксического анализа многострочной записи * .dat в одну строку - PullRequest
0 голосов
/ 04 августа 2020

Ищу некоторые идеи о лучших инструментах для обработки многострочных txt-записей в одной строке для ввода в Postgresql db.

Данные находятся в файле * .dat в формате;

B;666;4148672;2;20200803 01:04;;;5;AQUARIUS;VIRGO;2345470;1000;M;20200714;20200724;150000;R2;V;XX;;AFE;;0;ZZZZ396;
C;666;4148672;2;20200803 01:04;117-508A, 385-404B, 2-5A-C4387, 564654-25, 564654-24;
C;666;4148672;2;20200803 01:04;546654-28, 42785A-B-8, 44915-8-4;
D;666;4148672;2;20200803 01:04;P;;;;;;
D;666;4148672;2;20200803 01:04;V;;;;;;
B;666;4148672;3;20200803 01:04;;;5;TAURUS;AIRIES;586559;1000;M;20200714;20200724;150000;R2;V;XX;;AFE;;0;ZZZZ396;
C;666;4148672;3;20200803 01:04;5587T-33, 5454X-A;
D;666;4148672;3;20200803 01:04;P;;;;;;
D;666;4148672;3;20200803 01:04;V;;;;;;
B;667;4148672;1;20200803 01:04;;;5;AERO;GUNYA;586559;1000;M;20200714;20200724;150000;R2;V;XX;;AFE;;0;ZZZZ396;
C;667;4148672;1;20200803 01:04;8978-4;
D;667;4148672;1;20200803 01:04;P;;;;;;
D;667;4148672;1;20200803 01:04;V;;;;;;

Это 3 записи.

Разделителем является точка с запятой, что довольно надежно. Я хорошо понимаю, что это за поля. В файле есть строка заголовка A, в которой указана дата, и последняя строка Z, которая дает количество всех записей. Первый столбец, показанный здесь, B, C, D, обозначает атрибуты, которые необходимо объединить, строка C может повторяться один или несколько раз для создания поля с ~ 1000 символов. Похоже, что у автора есть ограничение на количество символов, которое он может написать в одной строке.

Очевидно, я был бы рад, если бы ответ содержал полное решение, но мой вопрос:

какие инструменты с этим справятся? Возможно, этот формат не уникален?

Вариант использования будет автоматизирован на сервере, python будет доступно, как и postgresql.

Отредактировано для отображения 3 записей.

1 Ответ

1 голос
/ 22 августа 2020

Я думаю, что это то, что вы ищете, хотя, если бы вы могли предоставить образец вывода, я мог бы отредактировать его по мере необходимости. (Какие три строки должны быть?) Здесь я объединил строки, если они начинаются не с B.

with open('myfile.txt') as file_handle:
    file_content = file_handle.read()

list_of_lines = []
concatenated_line = ""
for line in file_content.split('\n'):
    if line.startswith('B'):
        if len(concatenated_line)>0:
            list_of_lines.append(concatenated_line)
        concatenated_line = line
    else:
        concatenated_line+=line
list_of_lines.append(concatenated_line)
      
for line in list_of_lines:
    print(line.split(';'))

Что дает результат

['B', '666', '4148672', '2', '20200803 01:04', '', '', '5', 'AQUARIUS', 'VIRGO', '2345470', '1000', 'M', '20200714', '20200724', '150000', 'R2', 'V', 'XX', '', 'AFE', '', '0', 'ZZZZ396', 'C', '666', '4148672', '2', '20200803 01:04', '117-508A, 385-404B, 2-5A-C4387, 564654-25, 564654-24', 'C', '666', '4148672', '2', '20200803 01:04', '546654-28, 42785A-B-8, 44915-8-4', 'D', '666', '4148672', '2', '20200803 01:04', 'P', '', '', '', '', '', 'D', '666', '4148672', '2', '20200803 01:04', 'V', '', '', '', '', '', '']
['B', '666', '4148672', '3', '20200803 01:04', '', '', '5', 'TAURUS', 'AIRIES', '586559', '1000', 'M', '20200714', '20200724', '150000', 'R2', 'V', 'XX', '', 'AFE', '', '0', 'ZZZZ396', 'C', '666', '4148672', '3', '20200803 01:04', '5587T-33, 5454X-A', 'D', '666', '4148672', '3', '20200803 01:04', 'P', '', '', '', '', '', 'D', '666', '4148672', '3', '20200803 01:04', 'V', '', '', '', '', '', '']
['B', '667', '4148672', '1', '20200803 01:04', '', '', '5', 'AERO', 'GUNYA', '586559', '1000', 'M', '20200714', '20200724', '150000', 'R2', 'V', 'XX', '', 'AFE', '', '0', 'ZZZZ396', 'C', '667', '4148672', '1', '20200803 01:04', '8978-4', 'D', '667', '4148672', '1', '20200803 01:04', 'P', '', '', '', '', '', 'D', '667', '4148672', '1', '20200803 01:04', 'V', '', '', '', '', '', '']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...