PHP读取大的制表符分隔文件寻找一行

时间:2012-06-28 09:21:45

标签: php fopen tsv

我们从我们的供应商那里获得了一个由ftp提供给我们网站的产品清单。我需要创建一个脚本,搜索该文件(制表符分隔)以查找与我们相关的产品,并使用该信息更新库存水平,价格等。

文件本身就像38,000行一样,我想知道最好的处理方式。 我最初想到的唯一方法是使用fopenfgetcsv,然后在每一行中循环。将该行放入数组并查找相关的产品代码。 我希望有一种更有效的方法(虽然我还没有测试过它的效率)

我要读的文件是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
        }
}

虽然目前没有提供正确的输出

2 个答案:

答案 0 :(得分:0)

我曾经在日常数据(英国所有)中使用Dominos Pizza做类似的事情。

一次性将所有内容加载到数据库中。

OR

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

然后,您可以随意查询数据库。

答案 1 :(得分:0)

你是什么意思?我希望有一种更有效的方式«?对什么有效?写代码?执行代码时的CPU消耗?磁盘I / O?内存消耗?

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

  

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

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

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