由于双循环

时间:2017-03-28 19:39:01

标签: sql sql-server csv

我想将.csv文件导入SQL Server,我需要为给定行上的每个值检查它的类型,以确保文件中没有错误。

对于大文件来说这变得非常慢,因为我实际上为每一行做了一个双循环,然后对于行中的每个元素。

这个问题是否有更快的解决方案?我把当前的慢速代码作为参考,看看我是否得到了一些建议。请注意,schema是一个字典,用于定义每列的数据类型(即varchar,date等)

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

2 个答案:

答案 0 :(得分:1)

最简单的方法是直接从sql进行BULK INSERT。 如果需要一些验证,请创建一个具有相同模式的清理表,然后使用select查询将其放入实际表中。这肯定更快。 https://msdn.microsoft.com/de-de/library/ms188365.aspx

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

答案 1 :(得分:0)

完全!只需运行批量插入,这是超快的。一旦所有内容都加载到您选择的表中(并且谁在乎加载过程中是否存在错误),请运行一个小的控制检查脚本(或任何您想要调用的脚本)并在此时进行逻辑测试。加载到SQL Server的速度非常快,一旦所有内容都已经在SQL Server中,错误检查过程将非常快。