2012-03-20 81 views
0

我有一个超过5 MB的CSV文件。作为这样的例子,PHP通过CSV文件搜索

id,song,album,track 
200,"Best of 10","Best of 10","No where" 
230,"Best of 10","Best of 10","Love" 
4340,"Best of 10","Best of 10","Al Road" 

我有很多记录。我需要一次获得一个记录。假设我需要获得id 8999的详细信息。我的主要问题是是否有任何方法从CSV中获取确切的数据记录,就像我们在mysql表中查询一样。

除此之外,我在脑海中有以下解决方案来执行任务。最好的办法是什么?

  1. 阅读CSV和加载到阵列。然后搜索并获取数据。 (我必须得到所有记录。次序是不同的,这就是为什么我面对这个问题。其他明智的,我可以记录得到记录。)
  2. 导出CSV到MySQL数据库中,然后从该表中查询
  3. 阅读CSV所有无需将其加载到阵列的时间

如果我可以用快速方式在CSV文件中搜索,那将会很棒。感谢您的建议。

谢谢。

+0

可能重复的[如何提取从在PHP csv文件数据](http://stackoverflow.com/questions/2805427/how-to-extract-data-from-csv- file-in-php) – Gordon 2012-03-20 12:25:07

+0

如何解析(大)CSV文件之前已经被询问和回答过多次。我会告诉你如何使用IF,所以我在这里没有看到任何真正的问题。 – Gordon 2012-03-20 12:25:41

+0

@戈登。我的问题不是如何从CSV文件中提取数据。我已经这样做了。但是因为我加载了5 MB的文件,总是得到一个记录,我问的是有什么办法可以去确切的记录,并得到它,而无需一直加载文件。 – 2012-03-20 12:27:50

回答

1

我不知道是否有任何库允许您直接查询CSV文件。如果有,那将是你最好的选择。如果不是,这是另一种解决方案。

如果你想获得id 8999的细节,那么加载整个文件的效率会非常低。

你可以做这样的事情

阅读使用fgetsexplode上逗号线和检查0个元素。如果它不是您想要的ID,请丢弃并重复。

+0

只是fgets和explode在这种情况下是比较钝的工具 – Gordon 2012-03-20 12:32:50

+0

嗯,他可以使用'fgetcsv',但感觉这只是两者的结合。 – xbonez 2012-03-20 12:43:26

+0

fgetcsv提供了对csv行的更好控制,因此更为锐利 – Gordon 2012-03-20 12:44:42

0

不熟悉PHP,但是如果此查询频繁,请考虑将数据保存在内存中,并使用映射数据结构将其编入索引。 (也应在PHP阵列)

+0

PHP脚本仅适用于请求,因此您无法保留数据(除非使用共享内存段或信号量)。 – Gordon 2012-03-20 12:48:52