2014-01-02 2 views
1

У меня вопрос лучше сказать, как думать о лучшем решении этой проблемы. Мой файл CSV выглядит следующим образом:Python regex on csv file

,02/12/2013,03/12/2013,04/12/2013,05/12/2013,06/12/2013,07/12/2013,08/12/2013, 
06:00,"06:00 World Sport","06:00 World Sport","06:00 World Sport","06:00 World Sport","06:00 World Sport","06:00 World Sport","06:00 World Sport",06:00 
,,,,,,,, 
06:15,,,,,,,,06:15 
,,,,,,,, 
06:30,"06:30 Inside Africa: November 29, 2013","06:30 African Voices: Agatha Achindu","06:30 Inside the Louvre","06:30 Talk Asia: Franz Harary","06:30 Blueprint","06:30 Inside the Middle East","06:30 CNNGo",06:30 

Хорошо, что мне нужно сделать это, компилировать даты в диапазоне от 1 до сколько в одном листе, и поставить дату в каждой строке перед началом перед запятая как в этом примере:

02/12/2013, "06:00 World Sport", 03/12/2013 "06:00 World Sport", 04/12/2013 "06:00 World of Sport"... 
02/12/2013, "06:30 Inside Africa: November 23,2013", 03/12/2013, "06:30 African Voices.." 

И мой исходный код был так:

попробовать:

for line in fileinput.input(fnames): 

    if re.search(r'\d{2}/\d{2}/\d{4}.*',line): 
      line_date = re.findall(r'\d{2}/\d{2}/\d{4}',line)[0] 
      output.write(line_date+'\n') 

    if re.search(r'\".+?\"',line): 
     line_sadrzaj = re.findall(r'\".+?\"',line)[0] 
     output.write(line_sadrzaj+'\n') 



output.close() 

У вас есть и лучшая идея для этой проблемы.

Может быть так:

for line in fileinput.input(fnames): 

       if re.search(r'\d{2}/\d{2}/\d{4}.*',line): 
        line_date = re.findall(r'\d{2}/\d{2}/\d{4}.*',line)[0] 
        line_split = re.split(r'\,',line_date) 
        for line1 in line_split: 
         var = line1 
         output.write(var+'\n') 

       if re.search(r'\".+?\".*',line): 
        line_sadrzaj = re.findall(r'\".+?\".*',line)[0] 
        line_split1 = re.split (r'\,',line_sadrzaj) 
        for line2 in line_split1: 
         var2 = line2 
         output.write(var2+'\n') 
        #output.write(line_sadrzaj+'\n' 
+0

насчет расщепляется комы? –

+0

Да, я сделал код прямо сейчас, плохо обновляю сообщение –

+0

Как я могу присоединиться к первой дате и первому событию в одной строке, это проблема. :) –

ответ

3

Вам не нужно регулярное выражение вообще; просто используйте модуль csv для чтения файла csv, а затем преобразуйте результат в желаемый результат.

Пример:

import csv 
with open('csv.csv') as text: 
    table = list(csv.reader(text)) 

# get all dates (skipping first and last column) 
dates = table[0][1:-1] 

# get all shows (skipping first and last column and empty rows) 
shows = filter(''.join, (t[1:-1] for t in table[1:])) 

# join dates and shows back together and do some formatting 
for line in [zip(dates, s) for s in shows]: 
    print ', '.join('{}, "{}"'.format(*t) for t in line) 

Результат:

02/12/2013, "06:00 World Sport", 03/12/2013, "06:00 World Sport", 04/12/2013, "06:00 World Sport", 05/12/2013, "06:00 World Sport", 06/12/2013, "06:00 World Sport", 07/12/2013, "06:00 World Sport", 08/12/2013, "06:00 World Sport" 
02/12/2013, "06:30 Inside Africa: November 29, 2013", 03/12/2013, "06:30 African Voices: Agatha Achindu", 04/12/2013, "06:30 Inside the Louvre", 05/12/2013, "06:30 Talk Asia: Franz Harary", 06/12/2013, "06:30 Blueprint", 07/12/2013, "06:30 Inside the Middle East", 08/12/2013, "06:30 CNNGo" 
+0

Thans man действительно этот ответ мне очень помог: D –