2016-10-06 3 views
2

У меня возникли проблемы с загрузкой CSV-файла в таблицу на MS SQL Server. Файл CSV имеет 25 столбцов, а заголовок имеет то же имя, что и таблица в SQL, которая также имеет 25 столбцов. Когда я запускаю сценарий, он выдает ошибкуИмпорт CSV-файла в SQL Server с использованием Python

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

Каков наилучший способ импорта этих данных в MS SQL? Обе таблицы CSV и SQL имеют одинаковые имена столбцов.

Вот код:

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() 

Это то, что первые строки из файла CSV выглядит

enter image description here

+0

Не могли бы вы отобразить первые строки файла CSV (или первые столбцы первых строк ...), чтобы мы могли видеть, на что это похоже? –

+0

Только что снял скриншот, как выглядят данные. @SergeBallesta – Cesar

+1

Вы должны скопировать текст CSV, не снимать скриншот Excel, который удаляет разделители файла –

ответ

0

Вы используете csv.reader неправильно. Первый аргумент .reader не путь к файлу CSV, это

[аи] объект, который поддерживает протокол итератора и возвращает строку, каждый раз, когда его метод __next__() называется - файловые объекты и список объектов и подходящее.

Таким образом, согласно примеру, в documentation, вы должны делать что-то вроде этого:

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

Проверьте типы данных на столе, а размеры каждого поля, а также. Если это varchar (10) и ваши данные имеют длину 20 символов, это вызовет ошибку.

Кроме того,

Рассмотрим построение запроса динамически, чтобы обеспечить количество заполнителей соответствует вашей таблицы и формат файла CSV. Тогда просто вопрос обеспечения правильности таблицы и CSV-файла, а не проверки того, что вы набрали достаточно? заполнители в вашем коде.

В следующем примере предполагается

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() 

Если имена столбцов не включаются в файл:

... 
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() 

В основном, однако, ваш код выглядит нормально. Вот общий пример.

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()