2013-11-21 5 views
1

Я пытаюсь отделить этот файл csv от 2D-списка. Проблема с моим кодом в настоящее время заключается в том, что он отсекает несколько полей в строках с кавычками в данных. Здесь есть кавычки, чтобы обозначить, что запятая внутри не является частью разделения запятой полей и фактически является частью поля. Я разместил код, данные примера и вывод примера. Вы можете видеть, как первая выходная строка пропускает несколько полей по сравнению с остальными из-за кавычек. Что мне нужно делать с регулярной линией выражения? Спасибо за любую помощь заранее.Отдельные поля запятой и кавычками в Python?

Вот срез кода:

import sys 
import re 
import time 

# get the date 
date = time.strftime("%x") 


# function for reading in each line of file 
# returns array of each line 
def readIn(file): 
    array = [] 
    for line in file: 
     array.append(line) 
    return array 


def main(): 
    data = open(sys.argv[1], "r") 
    template = open(sys.argv[2], "r") 
    output = open(sys.argv[3], "w") 

    finalL = [] 

    dataL = [] 
    dataL = readIn(data) 

    templateL = [] 
    templateL = readIn(template) 

    costY = 0 
    dateStr = "" 

    # split each line in the data by the comma unless there are quotes 
    for i in range(0, len(dataL)): 
     if '"' in dataL[i]: 
      Pattern = re.compile(r'''((?:[^,"']|"[^"]*"|'[^']*')+)''') 
      dataL[i] = Pattern.split(dataL[i])[1::2] 
      for j in range(0, len(dataL[i])): 
       dataL[i][j] = dataL[i][j].strip() 
     else:  
      temp = dataL[i].strip().split(",") 
      dataL[i] = temp 

Пример данных:

OrgLevel3: ATHLET ,,,,,,,, 
,,,,,,,, 
Name,,,Calls,,Duration,Cost ($),, 
,,,,,,,, 
ATHLET Direct,,,"1,312 ",,62:58:18,130.62 ,, 
,,,,,,,, 
Grand Total for ATHLET:,,,"1,312 ",,62:58:18,130.62 ,, 
,,,,,,,, 
OrgLevel3: BOOK ,,,,,,,, 
,,,,,,,, 
Name,,,Calls,,Duration,Cost ($),, 
,,,,,,,, 
BOOK Direct,,,434 ,,14:59:18,28.09 ,, 
,,,,,,,, 
Grand Total for BOOK:,,,434 ,,14:59:18,28.09 ,, 
,,,,,,,, 
OrgLevel3: CARD ,,,,,,,, 
,,,,,,,, 
Name,,,Calls,,Duration,Cost ($),, 
,,,,,,,, 
CARD Direct,,,253 ,,09:02:54,14.30 ,, 
,,,,,,,, 
Grand Total for CARD:,,,253 ,,09:02:54,14.30 ,, 

Пример вывода:

['Grand Total for ATHLET:', '"1,312 "', '62:58:18', '130.62', ''] 
['Grand Total for BOOK:', '', '', '434 ', '', '14:59:18', '28.09 ', '', ''] 
['Grand Total for CARD:', '', '', '253 ', '', '09:02:54', '14.30 ', '', ''] 
+5

Вы просмотрели модуль ['csv'] (http://docs.python.org/2/library/csv.html)? –

+0

Является ли ваш «пример данных» - входными данными или выходными данными? –

+0

Да, входные данные являются примерными данными. И мне сказали не использовать модуль csv. Я пытаюсь использовать свой текущий код, но изменяю шаблон = re.compile (r '' '((?: [^, "'] |" [^ "] *" | '[^'] * ') +) '' ') – italianmoses

ответ

0

Если вы пытаетесь загрузить CSV в списке, то весь код, чтобы сделать так:

import csv 

with open(sys.argv[1]) as data: 
    dataL = list(csv.reader(data)) 

Если ваш пример данных входных данных, то нужно другую работу, прежде чем руки ..., например, :

dataL = [row for row in csv.reader(data) if row[0].startswith('Grand Total for')] 
+1

Зачем приложению OP придать данные примера, если это не входные данные ??? –

+0

@matti та же причина, о которой они не слышали о модуле 'csv'? Кроме того - обновлено, чтобы показать фильтрацию на «входе» –

+0

Я ценю параметр модуля csv, но мне сказали не использовать csv. Я пытаюсь сделать шаблон Pattern = re.compile (r '' '((?: [^, "'] |" [^ "] *" | '[^'] * ') +)' '') работа для этого случая первой строки примера вывода – italianmoses

Смежные вопросы