2017-02-07 15 views
0

Содержание CSV выглядит следующим образом:Как извлекать содержимое между и скобку (если таковой имеется) в CSV ROW, в Python

"Washington-Arlington-Al, DC-VA-MD-WV (MSAD)" 47894 1976 
"Grand-Forks, ND-MN"       24220 2006 
"Abilene, TX"         10180 1977 

Выход требуется для чтения через CSV, найти содержание между «» в столбце 1 и выбор только DC-VA-MD-WV, ND-MN, TX и помещает это содержимое в новый столбец. (Для нормализации)

До сих пор пробовал много шаблонов регулярных выражений в python, но не мог получить правильный.

sample=""" "Washington-Arlington-Al, DC-VA-MD-WV (MSAD)",47894,1976 
      "Grand-Forks, ND-MN",24220,2006 
      "Abilene, TX",10180,1977 """ 
open('sample.csv','w').write(sample) 
with open('sample.csv') as sample, open('output.csv','w') as output: 
    reader = csv.reader(sample) 
    writer = csv.writer(output) 
    for comsplit in row[0].split(','): 
     writer.writerow([ comsplit, row[1]]) 
    print open('output.csv').read() 

Выход Ожидаемое является:

DC-VA-MD-WV 
ND-MN 
TX 

в новой строке

+0

Неужели для этого требуется шаблон регулярного выражения? (извините довольно новый для python) – Viv

ответ

1

Там нет необходимости использовать регулярное выражение здесь предусмотрено несколько вещей:

  1. Город всегда запятая после следуют 1 пространство пробелов (хотя я мог бы добавить модификацию принять (?) более 1 бит пробелов, если необходимо)
  2. После вашей последовательности букв есть пробел, прежде чем встретить что-то вроде (MSAD).

Этого код дает ожидаемый выход против ввода пробы:

with open('sample.csv', 'r') as infile, open('expected_output.csv', 'wb') as outfile: 
    reader = csv.reader(infile) 
    expected_output = [] 
    for row in reader: 
     split_by_comma = row[0].split(',')[1] 
     split_by_space = split_by_comma.split(' ')[1] 
     print split_by_space 
     expected_output.append([split_by_space]) 

    writer = csv.writer(outfile) 
    writer.writerows(expected_output) 
1

Я бы сделать это так:

with open('csv_file.csv', 'r') as f_in, open('output.csv', 'w') as f_out: 
    csv_reader = csv.reader(f_in, quotechar='"', delimiter=',', 
          quoting=csv.QUOTE_ALL, skipinitialspace=True) 
    csv_writer = csv.writer(f_out) 
    new_csv_list = [] 
    for row in csv_reader: 
     first_entry = row[0].strip('"') 
     relevant_info= first_entry.split(',')[1].split(' ')[0] 
     row += [relevant_info] 
     new_csv_list += [row] 
    for row in new_csv_list: 
     csv_writer.writerow(row) 

Позвольте мне знать, если у вас есть какие-либо вопросы.

+0

Это не дает ожидаемого результата в 'new_csv_list' Я только что протестировал его – roganjosh

+0

Да, извините, я отредактирую его через секунду. Это просто отсутствует вариант. – Outis

+0

Хорошо, у меня есть рабочий код, но я дам вам шанс исправить это, прежде чем отправлять ответ. – roganjosh

0

кажется, что у вас возникли проблемы найти правильный regex использовать для нахождения ожидаемых значений.

Я создал небольшой образец pythext, который удовлетворит ваши требования.

В основном, когда вы проверяете содержание каждого значения первого столбца, вы можете использовать регулярные выражения, как /(TX|ND-MN|DC-VA-MD-WV)/

Я надеюсь, что это было полезно! Дайте мне знать, если вам нужны дополнительные объяснения.

+0

Это работает только для этого очень конкретного примера? Это не общее правило, которое может быть применено на основе структуры файла, а не его содержимого. – roganjosh

+0

может быть, было бы лучше что-то например '/ [AZ] {2} /', но я не уверен, что это именно то, что вы ищете – mabe02

+0

Я не OP :) – roganjosh

1

Я считаю, что вы могли бы использовать это регулярное выражение, которое будет извлекать любые алфавитно-цифровые выражения (с дефисом или нет) между запятой и скобка:

import re 
BETWEEN_COMMA_PAR = re.compile(ur',\s+([\w-]+)\s+\(') 
test_str = 'Washington-Arlington-Al, DC-VA-MD-WV (MSAD)' 
result = BETWEEN_COMMA_PAR.search(test_str) 
if result != None: 
    print result.group(1) 

Это будет печататься в результате: DC-VA-MD-WV, как и ожидалось ,