Специальная сортировка строк [Python 2.7] - PullRequest
0 голосов
/ 28 июня 2018

Я довольно новичок в python, и я пытался отсортировать эту строку определенным образом (снято с базы данных):

6392079|||| 1.0|03/09/2017|PARADIGM REAL-TIME REVEL INSULIN INFUSION PUMP|INSULIN INFUSION PUMP / SENSOR AUGMENTED|MEDTRONIC MINIMED|18000 DEVONSHIRE STREET||NORTHRIDGE|CA|91325||US|91325||MMT-723LNAH|MMT-723LNAH|||0LP|R|01/29/2014|OYC||Y

Это стандартный формат для следующих типов строк:

MDR_REPORT_KEY|DEVICE_EVENT_KEY|IMPLANT_FLAG|DATE_REMOVED_FLAG|DEVICE_SEQUENCE_NO|DATE_RECEIVED|BRAND_NAME|GENERIC_NAME|MANUFACTURER_D_NAME|MANUFACTURER_D_ADDRESS_1|MANUFACTURER_D_ADDRESS_2|MANUFACTURER_D_CITY|MANUFACTURER_D_STATE_CODE|MANUFACTURER_D_ZIP_CODE|MANUFACTURER_D_ZIP_CODE_EXT|MANUFACTURER_D_COUNTRY_CODE|MANUFACTURER_D_POSTAL_CODE|EXPIRATION_DATE_OF_DEVICE|MODEL_NUMBER|CATALOG_NUMBER|LOT_NUMBER|OTHER_ID_NUMBER|DEVICE_OPERATOR|DEVICE_AVAILABILITY|DATE_RETURNED_TO_MANUFACTURER|DEVICE_REPORT_PRODUCT_CODE|DEVICE_AGE_TEXT|DEVICE_EVALUATED_BY_MANUFACTUR

Можно ли как-нибудь распечатать эту строку, отсортированную по указанному типу данных рядом со значением? Например, в качестве вывода я хотел бы иметь

Report key: 6392079
Device sequence number: 1.0
Date received: 03/09/2017
Brand name: PARADIGM REAL-TIME REVEL INSULIN INFUSION PUMP

etc.etc. с другими значениями. Я думаю, что мне нужно было бы использовать "|" в качестве разделителя для разделения данных, но я не уверен, как это сделать. Я также не могу использовать сортировку с порядковым номером, потому что есть много вариантов строки выше, которые имеют разную длину.

Также, как вы можете видеть в строке, некоторые данные, такие как device_event_key, implant_flag, date_removed_flag и device_sequence number, отсутствуют, но все еще существуют соответствующие пустые вертикальные слэши.

Любая помощь будет принята с благодарностью, спасибо.

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

@ nsortur , вы можете попробовать следующий код, чтобы получить вывод.

Я использовал концепцию понимания списка , zip () function и split () , join () определенные методы на строковых объектах.

Вы можете попробовать запустить код онлайн на http://rextester.com/MBDXB29573 (Код прекрасно работает с Python2 / Python3).

string1 = "6392079|||| 1.0|03/09/2017|PARADIGM REAL-TIME REVEL INSULIN INFUSION PUMP|INSULIN INFUSION PUMP / SENSOR AUGMENTED|MEDTRONIC MINIMED|18000 DEVONSHIRE STREET||NORTHRIDGE|CA|91325||US|91325||MMT-723LNAH|MMT-723LNAH|||0LP|R|01/29/2014|OYC||Y"

keys = ["Report key", "Device sequence number","Date received", "Brand name"];

values = [key.strip() for key in string1.split("|") if key.strip()];

output = "\n".join([key + ": " + str(value) for key, value in zip(keys, values)]);

print(output);

выход

Report key: 6392079
Device sequence number: 1.0
Date received: 03/09/2017
Brand name: PARADIGM REAL-TIME REVEL INSULIN INFUSION PUMP
0 голосов
/ 28 июня 2018

Это может быть достигнуто простым split() методом str, split('|') будет иметь пустые строки для пустых значений между двумя |, а затем сопоставлять его с dict, имеющим атрибут как key и значение как value из dict

query = '6392079|||| 1.0|03/09/2017|PARADIGM REAL-TIME REVEL INSULIN INFUSION PUMP|INSULIN INFUSION PUMP / SENSOR AUGMENTED|MEDTRONIC MINIMED|18000 DEVONSHIRE STREET||NORTHRIDGE|CA|91325||US|91325||MMT-723LNAH|MMT-723LNAH|||0LP|R|01/29/2014|OYC||Y'

def get_detail(str_):
    key_finder = {'Report Key': 0, 'Device Sequence Number': 4, 'Device Recieved': 5, 'Brand Name': 6}
    split_by = str_.split('|')
    print('Report Key : {}'.format(split_by[key_finder['Report Key']]))
    print('Device Seq Num : {}'.format(split_by[key_finder['Device Sequence Number']]))
    print('Device Recieved : {}'.format(split_by[key_finder['Device Recieved']]))
    print('Brand Name : {}'.format(split_by[key_finder['Brand Name']]))

>>> get_detail(query)

Report Key : 6392079
Device Seq Num :  1.0
Device Recieved : 03/09/2017
Brand Name : PARADIGM REAL-TIME REVEL INSULIN INFUSION PUMP

Это работает, потому что разделенная строка будет проиндексирована с 0, поэтому Report Key будет иметь значение в 0-м индексе разделенной строки и так далее для других значений. Это будет соответствовать dict key_finder , который имеет сохраненный индекс для каждого значения.

0 голосов
/ 28 июня 2018

Используйте zip для объединения двух списков в пары кортежей:

data = '6392079|||| 1.0|03/09/2017|PARADIGM REAL-TIME REVEL INSULIN INFUSION PUMP|INSULIN INFUSION PUMP / SENSOR AUGMENTED|MEDTRONIC MINIMED|18000 DEVONSHIRE STREET||NORTHRIDGE|CA|91325||US|91325||MMT-723LNAH|MMT-723LNAH|||0LP|R|01/29/2014|OYC||Y'
format = 'MDR_REPORT_KEY|DEVICE_EVENT_KEY|IMPLANT_FLAG|DATE_REMOVED_FLAG|DEVICE_SEQUENCE_NO|DATE_RECEIVED|BRAND_NAME|GENERIC_NAME|MANUFACTURER_D_NAME|MANUFACTURER_D_ADDRESS_1|MANUFACTURER_D_ADDRESS_2|MANUFACTURER_D_CITY|MANUFACTURER_D_STATE_CODE|MANUFACTURER_D_ZIP_CODE|MANUFACTURER_D_ZIP_CODE_EXT|MANUFACTURER_D_COUNTRY_CODE|MANUFACTURER_D_POSTAL_CODE|EXPIRATION_DATE_OF_DEVICE|MODEL_NUMBER|CATALOG_NUMBER|LOT_NUMBER|OTHER_ID_NUMBER|DEVICE_OPERATOR|DEVICE_AVAILABILITY|DATE_RETURNED_TO_MANUFACTURER|DEVICE_REPORT_PRODUCT_CODE|DEVICE_AGE_TEXT|DEVICE_EVALUATED_BY_MANUFACTUR'
for label, value in zip(format.split('|'), data.split('|')):
    print("%s: %s" % (label.replace('_', ' ').capitalize(), value))

Это выводит:

Mdr report key: 6392079
Device event key:
Implant flag:
Date removed flag:
Device sequence no:  1.0
Date received: 03/09/2017
Brand name: PARADIGM REAL-TIME REVEL INSULIN INFUSION PUMP
Generic name: INSULIN INFUSION PUMP / SENSOR AUGMENTED
Manufacturer d name: MEDTRONIC MINIMED
Manufacturer d address 1: 18000 DEVONSHIRE STREET
Manufacturer d address 2:
Manufacturer d city: NORTHRIDGE
Manufacturer d state code: CA
Manufacturer d zip code: 91325
Manufacturer d zip code ext:
Manufacturer d country code: US
Manufacturer d postal code: 91325
Expiration date of device:
Model number: MMT-723LNAH
Catalog number: MMT-723LNAH
Lot number:
Other id number:
Device operator: 0LP
Device availability: R
Date returned to manufacturer: 01/29/2014
Device report product code: OYC
Device age text:
Device evaluated by manufactur: Y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...