2017-03-28 4 views
0

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 
+3

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

+0

combien de lignes avez-vous dans le csv? est-ce un one-off? – maSTAShuFu

+0

@criticalfix merci. semble bon conseil, je vais jeter un oeil. Avez-vous une solution rapide au code désordonné ci-dessus? – Dnaiel

Répondre

1

La façon la plus facile serait INSERT VRAC directement à partir sql. Si vous avez besoin de validation, créez une table de nettoyage avec le même schéma, puis placez-la dans la table réelle avec une requête de sélection. C'est sûr plus vite. https://msdn.microsoft.com/de-de/library/ms188365.aspx

BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail 
    FROM 'f:\orders\lineitem.tbl' 
    WITH 
     ( 
     FIELDTERMINATOR =' |', 
     ROWTERMINATOR =' |\n' 
    ); 
0

Exactement! Just Run Bulk Insert, qui est super rapide. Une fois que tout est chargé dans la table de votre choix (et qui se soucie s'il y a des erreurs pendant le chargement), lancez un petit script de contrôle (ou peu importe comment vous voulez l'appeler) et faites vos tests logiques à ce stade. La charge dans SQL Server sera très rapide, et le processus de vérification des erreurs sera très rapide, une fois que tout est déjà dans SQL Server.