2016-04-02 5 views
1

У меня есть более 200 файлов, которые я хочу разделить на значение столбца clName и сохранить заголовок во всех files.I также хотят, чтобы сохранить эти файлы с OriginalFileName-clName.txtРазделить файл CSV по значению столбца

ID Plate Well  ctr  clID  clName 
21 5  C03  1  50012  COL 
21 5  C03  1  50012  COL 
21 5  C03  1  50012  COL 
21 5  C04  1  50012  IA 
21 5  C04  1  50012  IA 
21 5  C05  1  50012  ABC 


import csv 
from itertools import groupby 

for key, rows in groupby(csv.reader(open("file.csv")), 
         lambda row: row[7]): 
    with open("%s.txt" % key, "w") as output: 
     for row in rows: 
      output.write(",".join(row) + "\n") 

Проблема, которую я имею, это столбец не всегда будет называться clName, его можно назвать clName, cll_n, c_Name. И иногда это будет столбец 7, иначе столбец 5 или 9.

То, что я знаю, разделяет файл по значению столбца, но не сохраняет заголовок, и я должен проверять каждый файл, чтобы найти его столбец 5 , 7, 9 и т. Д.

Есть ли способ проверить имена столбцов в списке имен и когда найдено одно из имен, разделите файл на это значение столбца?

пример данных https://drive.google.com/file/d/0Bzv1SNKM1p4uell3UVlQb0U3ZGM/view?usp=sharing

Спасибо

+0

Вы хотите сказать, что хотите добавить последний заголовок столбца в конец файла? Как бы вы определили, правильное ли имя указано в столбцах 5, 7 или 9? –

+0

Нет. Просто держите заголовок в каждом файле. И сохраните файл со значением столбца и исходным именем файла, например, originalfile-COL.txt –

ответ

2

Используйте csv.DictReader и csv.DictWriter вместо этого. Вот схема, которая должна указывать на вас в правильном направлении.

special_col = ['cll_n', 'clName'] 

with open('myfile.csv', 'r') as fh: 
    rdr = csv.DictReader(fh) 

    # now we need to figure out which column is used 
    for c in special_col: 
     if c in rdr.fieldnames: 
      break # found the column name 
    else: 
     raise IOError('No special column in file') 

    # now execute your existing code, but group by the 
    # column using lambda row: row[c] instead of row 7 
    call_existing_code(rdr, c) 


def call_existing_code(rdr, c): 
    # set up an output file using csv.DictWriter; you can 
    # replace the original column with the new column, and 
    # control the order of fields 

    with open('output.csv', 'w') as fh: 
     wtr = csv.DictWriter(fh, fieldnames=['list', 'of', 'fields']) 
     wtr.writeheader() 

     for row in groupby(rdr, lambda r: r[c]): 

      # [process the row as needed here] 

      wtr.writerow(row) 
Смежные вопросы