我目前正试图找到一个解决以下问题的方法:
我的任务是解析大型(+-3500行,300 by )管道分隔的文本文件,并将它们逐行与数据库中的相应代码进行比较。文件的一个例子是:
文件名: 015_A.txt
文件内容(示例只显示4行):
015|6999|Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old.|1|1|0|0|2016/01/01
015|3715|It has roots in a piece of classical Latin literature from 45 BC|1|1|213.5|213.5|2016/01/01
015|3724|Making it over 2000 years old.|1|1|617.4|617.4|2016/01/01
015|4028|Words will go here.|1|1|74|74|2016/01/01我将提供一个网页界面,我已经构建,允许从浏览器中选择一个文件,然后上传到服务器。
使用上面的示例管道文件,我将只使用以下这些:
代码(使用上面的第1行作为示例: 6999)
Price (使用上面第1行作为示例: 0)
然后(我不确定这是否是最好的方法)需要对每一行运行一个查询(我们的DB是MSSQL),例如:
SELECT t.Price
FROM table t
WHERE t.code = '6999'如果t.Price === 0,那么第1行已经通过。因为它等于源文件。
我相信这是我只需征询一些意见的地方,因为我相信有很多方法可以解决这个问题,我只想,如果可能的话,我只希望能有效率地向这个方向发展。(解析文件的最佳方法示例?我是按代码运行查询,还是使用IN子句执行SQL语句,然后比较每个代码和价格?我是否应该放弃这个想法,使用某种形式的纯SQL工具,同时要记住,我有管道文件要处理/导入。)
如有任何建议,将不胜感激。
发布于 2016-11-15 12:43:26
你的故事似乎有点过早结束了。这个脚本唯一应该做的事情是检查数据库中的值与文件中的文件匹配吗?如果是这样的话,那么从数据库中提取数据并覆盖文件就更简单了。如果不是,那么这意味着您需要保留一些变化的记录。
这对实现协调的方法有一定的影响;对数据库运行3500个查询将需要一些时间--主要用于网络和查询解析(即浪费时间)。OTOH在一次选择中比较3500条记录,找出不匹配将不需要任何时间。
问题是,您的数据在客户端,而通过浏览器上传的数据只将数据上传到数据库的一半。如果您在数据库上创建了另一个表(不是临时表--添加一个列来表示文件),那么可以在a single DML statement中插入多个行,但实际上您应该在大约100个记录中对它们进行批量处理,这意味着您只需要执行36个查询就可以完成操作--而且您已经在数据库中获得了一个数据记录,这简化了您报告不匹配的方式。
除非您绝对信任源数据,否则您可能不应该使用DBMS提供的实用程序直接导入。
https://stackoverflow.com/questions/40609637
复制相似问题