2016-07-27 5 views
1

저는 파이썬에서 초보자이고 문제가 있습니다.파이썬에서 복잡한 텍스트 파일 읽기

두 파일 사이의 값을 비교해야합니다. 하나는 Excel 파일이고 다른 하나는 줄이 공백 및 "블록"으로 구성된 텍스트 파일입니다.

텍스트 파일은 다음과 같다 : 등등 수천 라인 ... 나는 목록이 필요위한

LISON     Kontoauszug       10.07.2016   20:13 
        Monat/Jahr: 06.16        Seite:  1 

Lief. : AKJsjak0 (V Sachbearb.: Name Surname 
LT : VW0012 Lief.-Eigene.: 0     Tel.: xxxxxxxxxx 

Saldo Vorm.:  170 BEL.:  253 ENTL:  181 Endsaldo:  242 

B-Dat Abs/Empfae BEL. ENTL Saldo BA Bel-Nr WK-LG-LR Bemerkung 
050416 000590178  0  1  169 50 16103483 49-12-00 FERSR IM SY 
050416 000590178  0  1  168 50 16103484 49-16-00 FERSR IM SY 
050516 000590030  0  2  166 50 16104633 16-01-K1 
160516 000590030  0  1  165 50 16104980 16-01-K1 
170516 000590030  0  2  163 50 16105015 16-01-K1 
210516 000590120  1  0  164 51  36873 37- -  000590120 
230516 000590178  1  0  165 51 16105229 49-16-00 MPYTRRIN 
240516 000590030  0  2  163 50 16105243 16-01-K1 
300516 000590030  0  1  162 50 16105484 16-01-K1 
300516 000590030  0  1  161 50 16105483 16-01-K1 
310516 000590030  2  0  163 51 697321 26- -  KOR.GJKE.MB 
310516 000590030  0  2  161 50 16105536 16-01-K1 
310516 000590030  0  1  160 50 16105542 16-01-K1 
010616 000590120  2  0  162 21  39694 37- -  000590120 
010616 000710030  12  0  174 21 627948 21- -  000710030 
010616 000590120  0  1  173 50  39694 37- - 
030616 000712550  0  2  171 10 16105627 28-05-60 
030616 000710130  0  1  170 10 16105628 11-01-K4 
030616 000448489  0  2  168 10 16105638 18-66-23 
030616 000590120  0  2  166 10 16105626 37-75-I4 
060616 000590030  41  0  207 21 698299 26- -   000590030 
070616 000712550  0  2  205 10 16105714 28-05-60 
070616 000712550  0  1  204 10 16105717 28-08-60 
070616 000590178  0  1  203 10 16105710 49-16- 
070616 000590120  0  1  202 10 16105702 37-75-I4 
070616 000590120  0  1  201 10 16105703 37-78-I4 
070616 000590120  0  1  200 10 16105704 37-78-I8 
070616 000590235  0  1  199 10 16105707 33-07-K9 
070616 000710030  0  1  198 10 16105715 24-06-S2 
070616 000590030  0  1  197 10 16105716 16-01-K1 
070616 000590030  0  1  196 10 16105722 16-01-K1 
070616 000590030  0  3  193 10 16105726 16-01-K1 
070616 000711420  0  1  192 10 16105706 40-01-K1 
080616 000590120  1  0  193 21  31456 37- -  000590120 
080616 000590120  1  0  194 21  31456 37- -  000590120 
080616 000710030  2  0  196 21 630076 21- -  000710030 
080616 000710030  2  0  198 21 630076 21- -  000710030 
080616 000710030  4  0  202 21 630076 21- -  000710030 
080616 000710136  0  1  201 10 16105769 15-01-F4 
090616 000590178  2  0  203 21 491379 49- -  000590178 
090616 000710030  0  1  202 10 16105842 21-01-P0 
090616 000710030  0  4  198 10 16105843 21-01-P0 
------------------------------------------------------------------------------- 
-                - 
BA=10 Entlast. durch Lieferschein  BA=11 Belast. durch Lieferschein 
BA=20 Entlast. durch PV-Schein   BA=21 Belast. durch PV-Schein 
BA=22 Entlast. durch MRV-/Lieferschein BA=23 Belast. durch MRV- /Lieferschein 
BA=30 Entlast. durch Querverkehr  BA=31 Belast. durch Querverkehr 
BA=50 Entlast. durch Korrektur   BA=51 Belast. durch Korrektur 
BA=70 Entlast. durch Inventurangleich BA=71 Belast. durch Inventurangleich 
BA=NE Entlast. durch NeG neutr. Buch. BA=NB Belast. durch NeG neutr. Buch. 
BA=NK Neukauf       BA=VS Verschrottung 
BA=NW Neukauf Wertersatz    BA=NR Neukauf Recycling 
BA=VR Verschrottung Recycling 





LISON     Kontoauszug       10.07.2016  20:13 
        Monat/Jahr: 06.16        Seite: 2 

그리고 (아마도?) 또는 np.array을 (더 나은 인 경우)하게된다 txt의 모든 열 (B-Dat Abs/Empfae BEL 등) + 각 행의 LT 코드

TXT는

난 그냥이 코드를 작성 "이 ID와,이 양이 사라 졌어요이 LT 코드의 경우, 이러한 운동이이 시대에 ... 만들어진"와 비슷하지만 나도 몰라 절차를 수행하는 방법 ... np 및 표준 모듈을 모두 시험해 보았습니다 ...

제게 조언 좀 해 주시겠습니까? 아니면 코드를 구현하기위한 것입니다 ...

감사합니다.

+0

또한 다음과 같은 모든 다음과 같은 데이터 라인에 LT 라인의 메모를 유지하고 추가해야합니다 readln()을 사용하여 줄 단위로 문자열을 분할하고 데이터를 가져옵니다. –

답변

1

한 가지 방법은 파일을 한 번에 한 줄씩 읽고 일반 표현식을 사용하여 데이터 줄 중 하나인지 결정하는 것입니다. 있는 경우 목록에 추가하십시오.

import re 

data = [] 
lt = 'unknown' 

with open('input.txt') as f_input: 
    for row in f_input: 
     data_row = re.match(r'(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(.{8}) +(.*)|LT +: (\w+)', row) 

     if data_row: 
      if data_row.groups()[0]: 
       data.append([lt] + list(data_row.groups()[:-1])) 
      else: 
       lt = data_row.groups()[-1] 

print data  

이 당신에게 줄 것이다 작업을 다음 : 파일 라인을 읽기

[['VW0012', '050416', '000590178', '0', '1', '169', '50', '16103483', '49-12-00', 'FERSR IM SY'], ['VW0012', '050416', '000590178', '0', '1', '168', '50', '16103484', '49-16-00', 'FERSR IM SY'], ['VW0012', '210516', '000590120', '1', '0', '164', '51', '36873', '37- - ', '000590120'], ['VW0012', '230516', '000590178', '1', '0', '165', '51', '16105229', '49-16-00', 'MPYTRRIN'], ['VW0012', '310516', '000590030', '2', '0', '163', '51', '697321', '26- - ', 'KOR.GJKE.MB'], ['VW0012', '010616', '000590120', '2', '0', '162', '21', '39694', '37- - ', '000590120'], ['VW0012', '010616', '000710030', '12', '0', '174', '21', '627948', '21- - ', '000710030'], ['VW0012', '060616', '000590030', '41', '0', '207', '21', '698299', '26- - ', '000590030'], ['VW0012', '080616', '000590120', '1', '0', '193', '21', '31456', '37- - ', '000590120'], ['VW0012', '080616', '000590120', '1', '0', '194', '21', '31456', '37- - ', '000590120'], ['VW0012', '080616', '000710030', '2', '0', '196', '21', '630076', '21- - ', '000710030'], ['VW0012', '080616', '000710030', '2', '0', '198', '21', '630076', '21- - ', '000710030'], ['VW0012', '080616', '000710030', '4', '0', '202', '21', '630076', '21- - ', '000710030'], ['VW0012', '090616', '000590178', '2', '0', '203', '21', '491379', '49- - ', '000590178']]  
+0

정말 대단합니다, 고마워요! 그게 내가 원하는거야. 설명해 줄 수 있니, 원한다면, 정규식이하는 일은? – andrepogg

+0

RegEx는 배우기가 현명 할 거대한 주제입니다. 실제로 괄호 안의 각 섹션은 원하는 것입니다. +는 '하나 이상'을 의미하고 '\ d +'는 하나 이상의 숫자를 의미합니다. 끝에서'| '는'또는'을 의미합니다. 따라서 데이터 행을 일치 시키거나 LT 행과 일치시킵니다. 'data.row.groups()'를 출력하여 각 행에 대해 얻은 결과를 확인한 다음 나머지 코드를 이해하는 것이 좋습니다. –

+0

매우 감사, 당신은 내 문제를 해결! 나는 오늘 RegEx에 대해 더 많은 것을 알기 위해 pyDoc을 읽을 것입니다 ... – andrepogg