【问题标题】:Elegant PHP parsing solution for large pipe delimited text source files大型管道分隔文本源文件的优雅 PHP 解析解决方案
【发布时间】:2016-11-15 12:16:26
【问题描述】:

我目前正在尝试解决以下问题:

我的任务是解析大型(+-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

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

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

代码(以上面第1行为例:6999)

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

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

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

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

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

任何建议将不胜感激。

【问题讨论】:

    标签: php sql-server parsing import


    【解决方案1】:

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

    这对调解所采取的方法有一定的影响;对数据库运行 3500 个查询将需要一些时间 - 主要花在网络和查询解析上(即浪费)。 OTOH 在单个 SELECT 中比较 3500 条记录以查找不匹配将完全不需要时间。

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

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

    【讨论】:

    • 同意我的回答
    • 感谢您的回复,我会尝试进一步详细说明。这些 .txt 管道文件由另一家企业提供给我们,然后我们使用现有方法将其中许多文件导入我们的数据库,然后更新我们前端的定价。为此,我的任务是帮助我们的 QA 工作,以验证导入完成后所有代码及其相应的价格是否在数据库中并与导入的内容相匹配。
    • 这与您提出的问题不同;您还需要确保文件包含它们应该包含的所有记录(这需要将数据加载到数据库中)并且不包含它们不应该包含的记录。这也意味着一个非常广泛的反馈循环(即一个糟糕的 QA 流程)。
    猜你喜欢
    • 2023-03-19
    • 2011-02-13
    • 2011-04-12
    • 2010-10-04
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    相关资源
    最近更新 更多