2016-11-15 101 views
1

我目前正在试图拿出一个解决如下问题:优雅PHP解析方案文件

我一直负责大解析(+ -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)

然后,我会(在我看来不知道这是最好的方法),需要运行一个查询(我们DB是MSSQL)逐线,例如:

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

如果t.Price === 0,则第1行已通过。因为它等于源文件。

这是我相信我只是需要问一些意见,我相信有很多方法来解决这个问题,我只是想,如果可能的话,在一个有效的做这个方向指出方式。 (示例解析文件的最佳方法?是否对每个代码运行查询,或者使用IN子句执行SQL语句,然后比较每个代码和价格?是否应该放弃此想法并使用某种形式的纯SQL工具我有管文件来处理/导入。)

任何意见将不胜感激。

回答

1

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

这对采取的处理方法有一些影响;对数据库运行3500个查询将需要一些时间 - 主要用于网络和查询解析(即浪费)。 OTOH比较单​​个SELECT中的3500条记录来发现不匹配将不会花费任何时间。

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

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

+0

agree.same与我的回答 – plonknimbuzz

+0

感谢您的回应,我会尽力进一步阐述。这些.txt管道文件是由另一家企业提供给我们的,然后我们使用现有的方法将这些文件中的很多文件导入到我们的数据库中,然后在我们的前端更新定价。为此,我的任务是帮助我们的质量检查工作确保在导入完成后,所有代码及其相应的价格都在数据库中,并与导入的数据相匹配。 – BernardV

+0

对于你所问的问题,这是一个不同的问题;您还需要确保文件包含它们应该记录的所有记录(这需要将数据加载到数据库中)并且不包含它们不应该记录的记录。它也意味着一个非常宽的反馈环路(即一个糟糕的QA过程)。 – symcbean