2017-12-21 8 views
0

이 코드가 있으며이 코드의 모든 요소에 의미가 있습니다.비구 조형 데이터를 파이썬에서 구문 분석 가능한 형식으로 변환하십시오.

PRICING OPTION 11     TOTAL AMOUNT    40009 INR 
ADT        TAX INCLUDED 
1 UK 933 K 15FEB DEL BOM 1515 1725 TH 320  SRCI0 
2 NH 830 S 15FEB BOM NRT 2000 0715 + TH 788  SRCI0 
3 NH 829 V 19FEB NRT BOM 1115 1825 MO 788  VRCI0 
4 UK 988 K 19FEB BOM DEL 2045 2300 MO 320  VRCI0 
´BOOKª   +TQ              D R +8 

PRICING OPTION 12     TOTAL AMOUNT    40376 INR 
ADT        TAX INCLUDED 
1 NH @ 6431 S 15FEB DEL BOM 1500 1715 TH 73H  SRCI0 
2 NH 830 S 15FEB BOM NRT 2000 0715 + TH 788  SRCI0 
3 NH 827 W 19FEB NRT DEL 1715 0005 + MO 788  WRCI0 
´BOOKª   +TQ 

파이썬을 사용하여 각 줄을 추출하고 각 줄마다 공간을 분할하려고했습니다. 문제는 동일한 요소에 대해 서로 다른 행에서 공백 수가 다를 수 있다는 것입니다.

공간을 찾는 것 외에는이 코드에서 요소를 추출하는 더 좋은 방법이 있습니까?

+0

'split()'메소드는 실제로 여러 구분자를 축소하므로 문제가되지 않습니다. 또한, 'pandas'는 [고정 너비 컬럼 테이블] (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_fwf.html)을 읽을 수 있습니다. (다른'BOOK '블록 어쨌든 수동 처리가 필요합니다). – 9dogs

+0

도움이 될까요? a.split ('\ n')의 행에 대해 [re.split ('+', line) 인쇄] –

답변

1

당신은이 목적을 위해 정규식 분할을 사용할 수 있습니다!

>>> import re 
>>> [re.split(' +',line) for line in a.split('\n')] 
[['PRICING', 'OPTION', '11', 'TOTAL', 'AMOUNT', '40009', 'INR'], ['ADT', 'TAX', 'INCLUDED', ''], ['1', 'UK', '933', 'K', '15FEB', 'DEL', 'BOM', '1515', '1725', 'TH', '320', 'SRCI0'], ['2', 'NH', '830', 'S', '15FEB', 'BOM', 'NRT', '2000', '0715', '+', 'TH', '788', 'SRCI0'], ['3', 'NH', '829', 'V', '19FEB', 'NRT', 'BOM', '1115', '1825', 'MO', '788', 'VRCI0'], ['4', 'UK', '988', 'K', '19FEB', 'BOM', 'DEL', '2045', '2300', 'MO', '320', 'VRCI0'], ['´BOOKª', '+TQ', 'D', 'R', '+8'], [''], ['', 'PRICING', 'OPTION', '12', 'TOTAL', 'AMOUNT', '40376', 'INR'], ['ADT', 'TAX', 'INCLUDED', ''], ['1', 'NH', '@', '6431', 'S', '15FEB', 'DEL', 'BOM', '1500', '1715', 'TH', '73H', 'SRCI0'], ['2', 'NH', '830', 'S', '15FEB', 'BOM', 'NRT', '2000', '0715', '+', 'TH', '788', 'SRCI0'], ['3', 'NH', '827', 'W', '19FEB', 'NRT', 'DEL', '1715', '0005', '+', 'MO', '788', 'WRCI0'], ['´BOOKª', '+TQ', '']] 
1

당신이 사용할 수있는 정규 표현식 :

import re 
final_data = [list(filter(lambda x:x, re.split('\s+', i))) for i in data.split('\n')][1:-1] 

출력 :

[['PRICING', 'OPTION', '11', 'TOTAL', 'AMOUNT', '40009', 'INR'], ['ADT', 'TAX', 'INCLUDED'], ['1', 'UK', '933', 'K', '15FEB', 'DEL', 'BOM', '1515', '1725', 'TH', '320', 'SRCI0'], ['2', 'NH', '830', 'S', '15FEB', 'BOM', 'NRT', '2000', '0715', '+', 'TH', '788', 'SRCI0'], ['3', 'NH', '829', 'V', '19FEB', 'NRT', 'BOM', '1115', '1825', 'MO', '788', 'VRCI0'], ['4', 'UK', '988', 'K', '19FEB', 'BOM', 'DEL', '2045', '2300', 'MO', '320', 'VRCI0'], ['´BOOKª', '+TQ', 'D', 'R', '+8'], [], ['PRICING', 'OPTION', '12', 'TOTAL', 'AMOUNT', '40376', 'INR'], ['ADT', 'TAX', 'INCLUDED'], ['1', 'NH', '@', '6431', 'S', '15FEB', 'DEL', 'BOM', '1500', '1715', 'TH', '73H', 'SRCI0'], ['2', 'NH', '830', 'S', '15FEB', 'BOM', 'NRT', '2000', '0715', '+', 'TH', '788', 'SRCI0'], ['3', 'NH', '827', 'W', '19FEB', 'NRT', 'DEL', '1715', '0005', '+', 'MO', '788', 'WRCI0'], ['´BOOKª', '+TQ']] 
+1

나는 그것을 얻지 못합니다'final_data = [line.split() for data in data .split ('\ n')] [1 : -1]'똑같은 출력을냅니다. 왜 정규식을 필요로합니까? – 9dogs