[英]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.