2016-05-24 8 views
0

Ich habe zwei Datensätze. Die erste ist, wie folgt aus:Python 3.5 kombinieren zwei CSV durch die Anpassung mehrerer Spalten

data file: 
Column 1, Column 2, Column 3, Column 4, Column 5, Column 6 
1111111, 2222222, 3333333, 44444444, 55555555, 666666666 
0000000, 77777777, 8888888, 99999999, 10101010, 121212121 
3333333, 55555555, 9999999, 88888888, 22222222, 111111111 

Die zweite Datei ist wie folgt:

descriptors file: 
Column 1, Column 2, Column 3 
11111111,,   this is a descriptor 
      ,777777777, this is a descriptor again 
99999999, ,   last descriptor 

Was ich will, ist wie folgt:

Column 1, Column 2, Column 3, Column 4, Column 5, Column 6, Column 7 
1111111, 2222222, 3333333, 44444444, 55555555, 666666666, this is a descriptor 
0000000, 77777777, 8888888, 99999999, 10101010, 121212121, this is a descriptor again 
3333333, 55555555, 9999999, 88888888, 22222222, 111111111 

Ich habe den folgenden Code, von Foren, Ich habe für meine Verwendung manipuliert:

import csv 

with open('descriptors file.CSV', 'r') as first_file: 
    reader = csv.reader(first_file) 
    first_header = next(reader, None) 
    file_information = {row[0]: row for row in reader} 

with open('data file.CSV', 'r') as second_file: 
    with open('final results.csv', 'w', newline='') as outfile: 
    reader = csv.reader(second_file) 
    second_header = next(reader, None) 

    writer = csv.writer(outfile) 
    writer.writerow(second_header[:6] + first_header[2:]) 

    for row in reader: 
    if row[0] not in file_information: 
     continue 


    newrow = row[0:] + file_information[row[0]] 

    writer.writerow(newrow) 

Meine Probleme sind wie folgt: 1). Ich möchte zwischen Spalten 0 und 1 (1 und 2) passen, ich passe nicht zwischen 2 Spalten; nur eine 2). Die Ergebnisse enthalten keine Leerzeilen. Wenn beispielsweise in der Deskriptordatei, die in der Datendatei übereinstimmt, nichts gefunden wird, würde ich die Daten lieber in der Datendatei behalten, anstatt sie wegzuwerfen. Die Datendatei sollte um die Deskriptordatei erweitert und nicht reduziert werden.
3). Ich kann nicht herausfinden, wie sich nur auf die Deskriptoren Spalte schreiben, nicht die gesamte 3 Spalten in den Deskriptoren

+0

Wie viele Zeichenfolgen in data_file und descriptors_file? – BaZZiliO

+0

gibt es Hunderte von Zeilen in der Datendatei und 1500 oder so in der Beschreibungsdatei – james

+0

bin ich richtig, dass in beiden Dateien weniger als 10000 Zeilen? und Beschreibungsdatei länger, als data_file? Ich denke, data_file sollte länger sein. – BaZZiliO

Antwort

0

zunächst Datei - Ihre Dateien sind ein bisschen falsch:

1111111 != 11111111 
77777777 != 777777777 

ich dies und dieser Code behoben haben funktioniert gut für mich. Sorry für Hardcode. Wenn Sie eine komplexere Lösung benötigen, sagen Sie bitte, was Sie eigentlich wollen.

import csv 

with open('d_file.csv', 'r') as first_file: 
    reader = csv.reader(first_file) 
    first_header = next(reader, None) 
    column0= {} 
    column1 = {} 
    for row in reader: 
     if row[0]: 
      column0[row[0].strip()] = row[2] 
     if row[1]: 
      column1[row[1].strip()] = row[2] 

with open('data_file.csv', 'r') as second_file: 
    with open('final_results.csv', 'w', newline='') as outfile: 
     reader = csv.reader(second_file) 
     second_header = next(reader, None) 
     description = len(second_header)-1 
     writer = csv.writer(outfile) 
     # use there first_header[2:] is incorrect - you will save 'Column 3', while you want 'Column 7' 
     writer.writerow(second_header[:6] + ['Column 7']) 

     for row in reader: 
      if row[0].strip() in column0: 
       writer.writerow(row[0:] + [column0[row[0].strip()]]) 
      elif row[1].strip() in column1: 
       writer.writerow(row[0:] + [column1[row[1].strip()]]) 
      else: 
       writer.writerow(row[0:]) 
+0

Bazzillio, Ihre Lösung hat perfekt funktioniert. Ich war in der Lage zu nehmen, was Sie vorgeschlagen haben, und es in dem Beispiel zu verwenden, das ich gab, dann verwandelte es in mehr Gebrauchfälle. Ich werde sagen, dass es eine Herausforderung war, den pythonischen Weg zu finden, Dinge zu ändern, während ich dein Beispiel benutzte. Schätzen Sie das Expertenresultat und die schnellen Antworten. – james

Verwandte Themen