2009-08-03 5 views
2

J'essaie de fusionner trois champs dans chaque ligne d'un fichier CSV en utilisant Python. Ce serait simple, sauf que certains champs sont entourés de guillemets doubles et incluent des virgules. Voici un exemple:Comment fusionner des champs dans une chaîne CSV en utilisant Python?

,,Joe,Smith,New Haven,CT,"Moved from Portland, CT",,goo, 

Existe-t-il un algorithme simple qui pourrait fusionner les champs 7-9 pour chaque ligne dans ce format? Toutes les lignes ne comportent pas de virgules entre guillemets.

Merci.

Répondre

10

Quelque chose comme ça?

import csv 
source= csv.reader(open("some file","rb")) 
dest= csv.writer(open("another file","wb")) 
for row in source: 
    result= row[:6] + [ row[6]+row[7]+row[8] ] + row[9:] 
    dest.writerow(result) 

Exemple

>>> data=''',,Joe,Smith,New Haven,CT,"Moved from Portland, CT",,goo, 
... '''.splitlines() 
>>> rdr= csv.reader(data) 
>>> row= rdr.next() 
>>> row 
['', '', 'Joe', 'Smith', 'New Haven', 'CT', 'Moved from Portland, CT', '', 'goo', '' ] 
>>> row[:6] + [ row[6]+row[7]+row[8] ] + row[9:] 
['', '', 'Joe', 'Smith', 'New Haven', 'CT', 'Moved from Portland, CTgoo', ''] 
+0

@ S. Lott: Désolé de perturber la pomme-panier, mais en fait la lecture du code révèle ce résultat sera un tuple de 3 éléments dont la première et la troisième sera la liste ... par conséquent la sortie être un méli-mélo. –

+0

@ 9upvoters: ???? –

1

Vous avez marqué cette question comme 'base de données'. En fait, il serait peut-être plus facile de télécharger les deux fichiers dans des tables séparées de la base de données (vous pouvez utiliser sqllite ou n'importe quelle bibliothèque python sql, comme sqlalchemy) et ensuite les joindre.

Cela vous donnera un avantage après, vous seriez en mesure d'utiliser une syntaxe SQL pour interroger les tables et vous pouvez le stocker sur le disque au lieu de le garder sur la mémoire, alors pensez à ce sujet .. :)

2

vous pouvez utiliser le module csv pour faire le levage de charges lourdes: http://docs.python.org/library/csv.html

vous ne dites pas comment vous vouliez exactement de fusionner les colonnes; vous ne voulez probablement pas que votre champ fusionné soit "déplacé de Portland, CTgoo". Le code ci-dessous vous permet de spécifier une chaîne de séparateur (peut-être ", ") et gère les champs vides/vides.

[transcript of session] 
prompt>type merge.py 
import csv 

def merge_csv_cols(infile, outfile, startcol, numcols, sep=", "): 
    reader = csv.reader(open(infile, "rb")) 
    writer = csv.writer(open(outfile, "wb")) 
    endcol = startcol + numcols 
    for row in reader: 
     merged = sep.join(x for x in row[startcol:endcol] if x.strip()) 
     row[startcol:endcol] = [merged] 
     writer.writerow(row) 

if __name__ == "__main__": 
    import sys 
    args = sys.argv[1:6] 
    args[2:4] = map(int, args[2:4]) 
    merge_csv_cols(*args) 

prompt>type input.csv 
1,2,3,4,5,6,7,8,9,a,b,c 
1,2,3,4,5,6,,,,a,b,c 
1,2,3,4,5,6,7,8,,a,b,c 
1,2,3,4,5,6,7,,9,a,b,c 

prompt>\python26\python merge.py input.csv output.csv 6 3 ", " 

prompt>type output.csv 
1,2,3,4,5,6,"7, 8, 9",a,b,c 
1,2,3,4,5,6,,a,b,c 
1,2,3,4,5,6,"7, 8",a,b,c 
1,2,3,4,5,6,"7, 9",a,b,c 
Questions connexes