优雅的PHP解析解决方案,适用于大型管道分隔的文本源文件

时间:2016-11-15 12:16:26

标签: php sql-server parsing import

我目前正试图找到解决以下问题的方法:

我的任务是解析大的(+ -3500行300kb)管道分隔文本文件,并逐行比较它们与我们数据库中的相应代码。文件的一个例子是:

文件名: 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

我将提供一个我已经构建的Web界面,允许从浏览器中选择文件,然后上传到服务器。

使用上面的示例管道文件我将只使用这些:

代码(使用第1行作为示例:6999)

价格(以第1行为例:0)

我会(我不确定这是否是最佳方法)需要为每一行运行查询(我们的数据库是MSSQL),例如:

SELECT t.Price
FROM table t
WHERE t.code = '6999'
  

如果t.Price === 0,那么第1行已经过去了。因为它等于源文件。

这是我认为我只需要提出一些建议的地方,因为我确信有很多方法可以解决这个问题,如果可能的话,我希望以有效的方式指出这样做的方向。 (解析文件的最佳方法示例?我是按代码运行查询还是使用IN子句执行SQL语句然后比较每个代码和价格?我应该废弃这个想法并使用某种形式的纯SQL工具记住我有管道文件来处理/导入。)

非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

你的故事似乎有些过早地结束了。这个脚本应该做的唯一事情是检查数据库中的值是否与文件中的文件匹配?如果是这样,从数据库中提取数据并覆盖文件会更简单。如果没有,那么这意味着您需要保留一些变化记录。

这与对和解的方法有关;对数据库运行3500次查询将花费一些时间 - 主要用于网络和查询解析(即浪费)。 OTOH在单个SELECT中比较3500条记录以找到不匹配的内容将花费时间。

问题是您的数据在客户端外出,并且通过浏览器上传只能将数据传输到数据库的一半。如果在数据库上创建另一个表(不是临时表 - 添加一个列来表示文件),可以在a single DML statement中插入多行,但实际上你应该在100个左右的记录中批量处理它们。 ,这意味着您只需执行36个查询即可完成操作 - 并且您已获得数据库中的数据记录,这简化了报告不匹配的方式。

除非您绝对信任源数据,否则您可能不应该使用DBMS提供的实用程序进行直接导入。