繁体   English   中英

由于双循环,将csv文件导入SQL Server速度很慢

[英]Import csv file into SQL Server slow because of double loop

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

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

有更快的解决方案吗? 我将当前的慢速代码作为参考,以查看是否有建议。 请注意,架构是一个字典,它定义每一列的数据类型(即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

最简单的方法是直接从sql批量插入。 如果需要进行验证,请使用相同的架构创建一个清理表,然后使用选择查询将其放入真实表中。 这肯定更快。 https://msdn.microsoft.com/de-de/library/ms188365.aspx

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

究竟! 只需运行批量插入,这是超快速的。 将所有内容加载到您选择的表中后(谁在乎加载过程中是否有错误),请运行一个小的控件检查脚本(或任何您想调用的脚本),然后进行逻辑测试。 一旦所有内容都已包含在SQL Server中,则将非常快速地加载到SQL Server中,并且错误检查过程将非常快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM