2014-01-14 5 views
1

У меня есть CSV, который визуально не выглядит сломанным. Один из столбцов содержит полные электронные письма и последующие дополнительные запятые. Формат что-то вроде:Python CSV Reader, форматирование CSV

ID | Info | Email   | Notes 
-------------------------------------------------- 
1234 | Sample | Full email here,| More notes here 
       | and email wraps.| 
-------------------------------------------------- 
5678 | Sample2| Another email, | More notes 
-------------------------------------------------- 
9011 | Sample3| More emails  | Etc. 
-------------------------------------------------- 

Я использую читатель CSV, который выводит каждую новую строку в качестве новой строки, и это неправильно. Например, я получаю:

Line 1: 1234 | Sample | Full email here,| More notes here 
Line 2:    | and email wraps.| 
Line 3: 5678 | Sample2| Another email, | More notes 
Line 4: 9011 | Sample3| More emails  | Etc. 

Мне это нужно, чтобы быть в состоянии признать разделители ячеек так же, как Excel или Libre бюро сделать, и получить это:

Line 1: 1234 | Sample | Full email here, and email wraps.| More notes here 
Line 2: 5678 | Sample2| Another email, | More notes 
Line 3: 9011 | Sample3| More emails  | Etc. 

У меня есть этот код:

import csv 
import sys 
csv.field_size_limit(sys.maxsize) 
file = "myfile.csv" 
with open(file, 'rU') as f: 
    freader = csv.reader(f, delimiter = '|', quoting=csv.QUOTE_NONE) 
    for row in freader: 
     print(','.join(row)) 

Я пробовал разделитель = ',' или delimiter = '\ n', но не повезло. Любые идеи?

+0

Не могли бы вы добавить * фактические * данные в файле CSV для трех записей, которые вы используете в вашем примере? – martineau

+0

Извините, это конфиденциально. –

ответ

8

CSV stands for comma separated values. Хотя его можно изменить разделитель для вкладок, труб или все, что вы чувствуете, как, то и дело, являются версии CSV очень сырой, линия на основе формата.

Проблема заключается в вашей второй записи, которая охватывает линии, которые не работает с точки зрения CSV-файла. Библиотека Python CSV не предназначена для размещения таких вещей, потому что это не в стиле CSV-файла.

Чтобы сделать то, что вы просите, было бы лучше написать собственный синтаксический анализатор, который разбивает каждую строку на разделителе и объединяется на основе некоторой логики. Это должно быть относительно тривиально. iff В столбце ID никогда не лежат две строки.

А как на самом деле написать код, вам нужен процесс, как показано ниже:

Initialise array X 
Read each line L of file F: 
    If the ID field is empty then merge each entry into the previous line L-1 
    Otherwise append the line L to array X 
+0

Идентификационные столбцы никогда не охватывают две строки. Как я могу его разобрать, любой модуль для этого? –

+1

@rebHelium. Разбирайте его, написав код, и нет модуля, который я знаю о том, что делает то, что вы хотите. –

+0

@rebHelium Я добавил в некоторый псевдокод, который должен объяснить процесс, который вам понадобится. –

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