2016-11-15 2 views
0

Я пробовал (4 часа потратил чтение документов, googling, ...), и это должен быть мой мозг, поэтому я был бы признателен за любой нежный толчок или правильный удар в правильном направлении:Обработка регулярных выражений CSV-записей в python

Получил .csv файл, который мне нужно обрабатывать: только сохранить определенные регулярные выражения, совпадающие строки (RE является ^[A-Z][A-Z];.*15%;), а затем распечатать конкретные столбцы (скажем, 1, 2, 13, 15 и 17). Очень легко в оболочке (grep, awk), невозможно (для меня) в python.

Это код, который я придумал до сих пор:

import re 
import csv 
src="/Users/username/file.csv" 
reg="^[A-Z][A-Z];.*15%;" 
with open(src, "r") as file: 
    for line in file: 
     line=line.strip() 
     match = re.match(reg,line.strip()) 
     if match: 
      vat=csv.reader(line, delimiter=';') 
      for r in vat: 
       print r[0] 

Вопреки моему убеждению, модуль CSV разбирает каждый символ в виде записи, а не всей линии, следовательно, выход не поле [0] массив, но 1 символ.

Если добавить строку после печати, если матч

if match: 
    print line 

строки печатаются правильно, значит, моя путаница - почему csv.reader не относиться к ним как таковой?

Ожидая услышать ваши мысли - зная питона, решение очень просто ;-)

PS: бонусные баллы, если RE соответствия могут быть сделаны на отдельных колонках, я. е. только технологическая линия, если столбец 1 соответствует [AZ] [AZ], игнорируя случай и колонка 17 матчей 15% - то печатные столбцы 1, 2, 13, 15 и 17.

+0

'csv.reader' перебирать объект, который вы ему даете, а затем разбить на список строк. Вы кормите csv.reader линией вместо файла. Когда вы перебираете строку (которая является строкой), вы получаете символы как _records_, когда вы перебираете файл, вы получаете строки. –

ответ

0
with open(src, newline='') as file: 
    r = csv.reader(file, delimiter=';') 
    for line in r: 
     if len(line[0]) ==2 and line[0].isalpha() and line[16]=='15%': 
      print(line) #Or whatever it is you want to do 

Нет регулярное выражение действительно необходимо, но r'[a-zA-Z]{2}' может также работать

+0

Shoud be: 'line [16] == '15%'' (синтаксическая ошибка). Невозможно отредактировать этот пост напрямую, потому что «Редактирование должно быть не менее 6 символов»;) –

+0

@dr_agon good catch –

+0

благодарит Патрика! Это сделал трюк :-) гораздо более элегантный, чем мой (что еще не все так сложно) ;-) –