我想将.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
答案 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中,错误检查过程将非常快。