2016-10-06 1 views
2

Ich habe Probleme beim Hochladen einer CSV-Datei in eine Tabelle in MS SQL Server, Die CSV-Datei hat 25 Spalten und die Überschrift hat den gleichen Namen wie die Tabelle in SQL, die auch 25 Spalten hat. Beim Ausführen des Skripts wird ein Fehler ausgegebenImportieren CSV-Datei in SQL Server mit Python

params arg (<class 'list'>) can be only a tuple or a dictionary 

Was ist der beste Weg, um diese Daten in MS SQL zu importieren? Sowohl die CSV- als auch die SQL-Tabelle haben genau die gleichen Spaltennamen. Hier

ist der Code:

import csv 
import pymssql 

conn = pymssql.connect(
    server="xx.xxx.xx.90", 
    port = 2433, 
    user='SQLAdmin', 
    password='xxxxxxxx', 
    database='NasrWeb' 
) 

cursor = conn.cursor() 
customer_data = csv.reader('cleanNVG.csv') #25 columns with same header as SQL 

for row in customer_data: 
    cursor.execute('INSERT INTO zzzOracle_Extract([Customer Name]\ 
     ,[Customer #]\ 
     ,[Account Name]\ 
     ,[Identifying Address Flag]\ 
     ,[Address1]\ 
     ,[Address2]\ 
     ,[Address3]\ 
     ,[Address4]\ 
     ,[City]\ 
     ,[County]\ 
     ,[State]\ 
     ,[Postal Code]\ 
     ,[Country]\ 
     ,[Category ]\ 
     ,[Class]\ 
     ,[Reference]\ 
     ,[Party Status]\ 
     ,[Address Status]\ 
     ,[Site Status]\ 
     ,[Ship To or Bill To]\ 
     ,[Default Warehouse]\ 
     ,[Default Order Type]\ 
     ,[Default Shipping Method]\ 
     ,[Optifacts Customer Number]\ 
     ,[Salesperson])''VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,)',row) 

conn.commit() 
cursor.close() 
print("Done") 
conn.close() 

Dies ist, was die ersten Zeilen der CSV-Datei sieht aus wie

enter image description here

+0

Können Sie die ersten Zeilen der CSV-Datei (oder die ersten Spalten der ersten Zeilen ...) anzeigen, damit wir sehen können, wie es ist? –

+0

Ich habe gerade einen Screenshot gemacht, wie die Daten aussehen. @SergeBallesta – Cesar

+1

Sie sollten den Text der CSV kopieren, nicht einen Screenshot von Excel, der die Trennzeichen der Datei entfernt –

Antwort

0

Du csv.reader falsch verwenden. Das erste Argument für .reader ist nicht der Pfad zu der CSV-Datei, ist es

[ein] Objekt, das das Iterator-Protokoll unterstützt und gibt eine Zeichenfolge jedes Mal seiner __next__() Methode aufgerufen wird - Dateiobjekte und Listenobjekte sind sowohl geeignet.

daher gemäß dem Beispiel in der documentation, sollten Sie so etwas wie dies tun:

import csv 
with open('cleanNVG.csv', newline='') as csvfile: 
    customer_data = csv.reader(csvfile) 
    for row in customer_data: 
     cursor.execute(sql, tuple(row)) 
0

Überprüfen Sie die Datentypen auf dem Tisch, und die Größen der einzelnen als auch Feld. Wenn es varchar (10) ist und Ihre Daten 20 Zeichen lang sind, wird ein Fehler ausgegeben. Auch

,

Betrachten Sie die Abfrage erstellt dynamisch die Anzahl der Platzhalter entspricht Ihrer Tabelle und CSV-Dateiformat zu gewährleisten. Dann müssen Sie sicherstellen, dass Ihre Tabelle und die CSV-Datei korrekt sind, anstatt zu prüfen, ob Sie genug eingegeben haben. Platzhalter in Ihrem Code.

Das folgende Beispiel geht davon aus

CSV file contains column names in the first line 
Connection is already built 
File name is test.csv 
Table name is MyTable 
Python 3 

... 
with open ('test.csv', 'r') as f: 
    reader = csv.reader(f) 
    columns = next(reader) 
    query = 'insert into MyTable({0}) values ({1})' 
    query = query.format(','.join(columns), ','.join('?' * len(columns))) 
    cursor = connection.cursor() 
    for data in reader: 
     cursor.execute(query, data) 
     cursor.commit() 

Wenn Spaltennamen werden nicht in der Datei enthalten:

... 
with open ('test.csv', 'r') as f: 
    reader = csv.reader(f) 
    data = next(reader) 
    query = 'insert into dbo.Test values ({0})' 
    query = query.format(','.join('?' * len(data))) 
    cursor = connection.cursor() 
    cursor.execute(query, data) 
    for data in reader: 
     cursor.execute(query, data) 
    cursor.commit() 

Grundsätzlich aber Ihr Code sieht gut aus. Hier ist ein generisches Beispiel.

cur=cnxn.cursor() # Get the cursor 
csv_data = csv.reader(file(Samplefile.csv')) # Read the csv 
for rows in csv_data: # Iterate through csv 
    cur.execute("INSERT INTO MyTable(Col1,Col2,Col3,Col4) VALUES (?,?,?,?)",rows) 
cnxn.commit() 
Verwandte Themen