0

我们从供应商那里得到一份产品清单,通过 ftp 传送到我们的站点。我需要创建一个脚本,通过该文件(制表符分隔)搜索与我们相关的产品,并使用这些信息来更新库存水平、价格等。

该文件本身大约有 38,000 行长,我想知道处理这个问题的最佳方法。我最初能想到的唯一方法是使用fopen然后fgetcsv循环遍历每条线。将该行放入数组并查找相关产品代码。我希望有一种更有效的方法(尽管我还没有测试过这种方法的效率)

我要阅读的文件是 8.8 Mb。所有这些都需要自动完成,例如由 CRON 每天完成。

编辑 - 更多信息。我已经运行了我的第一次试验,并且基于 2 个答案,我有以下代码: 我有我需要从数组中的数据库中的文本文件中挑选出来的项目$items[$row['item_id']] = $row['prod_code'];

$catalogue = file('catalogue.txt');
while ($line = $catalogue)
{
$prod = explode("   ",$line);
if (in_array($prod[0],$items))
    {
        echo $prod[0]."<br>";//will be updating the stock level in the db eventually
        }
}

虽然这目前没有给出正确的输出

4

2 回答 2

0

我曾经在每日数据(全英国)中对 Dominos Pizza 做类似的事情。

要么一次性将其全部加载到数据库中。

或者

使用 fopen 并一次将一行加载到数据库中,从而保持较低的内存开销。(我不得不使用这种方法,因为数据的格式不是很好)

然后,您可以在闲暇时查询数据库。

于 2012-06-28T09:28:24.733 回答
0

“我希望有更有效的方法”是什么意思?对什么有效?写代码?执行代码时CPU消耗?磁盘 I/O?内存消耗?

在内存中保存约 9MB 的文本不是问题(除非您的内存限制非常低)。file()调用将读取整个文件并返回一个数组(按行分割)。这或file_get_contents()将是磁盘 I/O 方面最有效的方法,但会消耗比必要更多的内存。

将该行放入数组并查找相关产品代码。

我不确定为什么需要将该文件的内容缓存在数组中。但如果你这样做了,请记住该数组将使用比约 9MB 文本稍多的内存。因此,您可能希望按顺序读取文件,以避免在内存中两次存储相同的数据。

正如@user1487944 已经指出的那样,根据您要对数据执行的操作,将其加载到数据库中也可能是一个可行的解决方案。

于 2012-06-28T09:35:23.237 回答