c# – 逐行插入大量数据,并进行关系检查和可能的错误数据

我在这里阅读了许多与此类似的文章和问题,但是havnt发现了任何接近的内容.

我在10列excel文件中有40,000行.
这里的数据是用纸手工打印的.

有两个主要数字,MO&订单,在我需要先检查的文件中.
由于这些是手动打字,因此可能是错误的.

我有2张桌子
MO表

moID     MO       Order
3409    87234    23845
3410    84562    21342
etc... (38k rows)

printID   moID   user   date   printer
5         3409   Brad   01/24  printer1
34        3409   Brad   01/30  printer1
40        3410   Joe    01/31  printer1
etc... (9k ish and growing)

处理:

我遍历我的c#app中的每一行,查询以获取moID.然后查询作业是否已存在,然后执行插入操作.如果无法找到moID,我会查询记录可能的MO&订单组合让他们以后修复文件.

链接问题:

curMOID = dbReports.MoNumbers.Where(r => r.moNumber == moNum && r.moOrder == orderNum).Select(c => c.id_moNumber).FirstOrDefault();
var printJobs = dbReports.PaperPrints.Where(q => q.id_moNumber == curMOID && q.printDate == printDate && q.rowExcelFile == curRow);
if (printJobs.Where(q => q.printSize == null).Count() == 0)

题:

我的moID查询需要~250ms(应用程序时间,直接查询为〜.075ms).与已存在和选项列表相同.因此,每行大约需要0.5秒才能完成. 40k行需要5个小时.我必须每天与用户这样做.有没有更好的方法来执行此操作或某种方式来加快查询通过应用程序.

最佳答案 是的,这是一种痛苦的,非常痛苦的方法.有一种无痛的方式,更快,不涉及任何编码.

第1步:将文件导出为CSV

第2步:使用LOAD DATA INFILE
使用它将数据加载到虚拟表中

The LOAD DATA INFILE statement reads rows from a text file into a
table at a very high speed

第3步:创建目标表

使其与虚拟表完全相同,但请确保您对不希望重复的列具有唯一索引.

您可以使用CREATE TABLE LIKE声明执行此操作

第4步:从temp到最终选择
是的,语法是

INSERT IGNORE INTO destination SELECT * FROM tmp_table

步骤5:使用multi table delete清理tmp_table

你有一个表格,其中包含无法导入的行.你用一行代码完成了一分钟

点赞