Je veux importer un fichier .csv
dans SQL Server et j'ai besoin pour chaque valeur sur une ligne donnée de vérifier qu'il est de type pour s'assurer qu'il n'y a pas d'erreur dans le fichier.Importer le fichier csv dans SQL Server lent à cause de la double boucle
Cela devient très lent pour les fichiers volumineux car je fais effectivement une double boucle, pour chaque ligne, puis pour chaque élément de la ligne.
Y at-il une solution plus rapide à ce problème? J'ai mis le code lent courant pour référence pour voir si je reçois quelques suggestions. Notez que le schéma est un dictionnaire qui définit le type de données pour chaque colonne (i.e., varchar, date, etc.)
with open(csv_filename, encoding='utf8') as csv_f:
reader = csv.DictReader(csv_f)
idx = 1
select_code_l = []
for row in reader:
# add new value to row
if d is not None:
for key,value in d.items():
row[key] = value
# get all the values in the schema
row_values = []
schema_iterator = schema_df.iterrows()
for i, schema in schema_iterator:
schema_name = schema['field']
value = row[schema2csv[schema_name]]
#print(value)
schema_type = schema['type'].split('(')[0].lower()
if schema_type == 'varchar' or schema_type == 'date' or schema_type == 'datetime2' or schema_type == 'datetime2':
row_values.append("'"+str(value).replace("'","''")+"'")
elif schema_type == 'bigint':
if value == '':
row_values.append('NULL')
else:
row_values.append(str(int(float(value))))
elif schema_type == 'float':
if value == '':
row_values.append('NULL')
else:
row_values.append(str(float(value)))
else:
print ('ERROR')
return 0
Vous pouvez utiliser SQL Server Integration Services (SSIS), qui a une certaine courbe d'apprentissage, mais qui est très rapide. C'est le bon outil pour ce genre de travail. – criticalfix
combien de lignes avez-vous dans le csv? est-ce un one-off? – maSTAShuFu
@criticalfix merci. semble bon conseil, je vais jeter un oeil. Avez-vous une solution rapide au code désordonné ci-dessus? – Dnaiel