【问题标题】:Is it possible to load a single row from a CSV file?是否可以从 CSV 文件加载单行?
【发布时间】:2015-05-30 18:25:20
【问题描述】:

使用 PHP,是否可以从 CSV 文件中仅加载单个记录/行?

换句话说,我想把文件当作一个数组,但不想把整个文件加载到内存中。

我知道这确实是数据库的用途,但我只是在寻找一个在开发过程中使用的糟糕的解决方案。

编辑:澄清一下,我确切地知道哪一行包含我正在寻找的信息。

我只是想知道是否有一种方法可以在无需将整个文件读入内存的情况下获取它。

【问题讨论】:

  • 是的,您可以使用fgetcsv 加载单行。除此之外,这个问题有点模糊。您对该行有什么进一步的要求?是否要从文件中间、未知位置、按某些条件过滤...?
  • 这是不可能的。您只需要通读每一行,直到找到您要查找的内容。我已经看到了几个脚本,它们为您抽象了它,因此您可以编写“查询”,但在引擎盖下它仍然可以正常工作。编辑:你可以一次读 1 行,但我 假设你的意思是选择一个特定的行

标签: php arrays csv


【解决方案1】:

据我了解,您正在寻找包含某些数据的行。因此,您可能可以实现以下逻辑: (1) 扫描文件以获取给定数据(例如,您要查找的行中的值), (2) 只加载这行文件, (3) 在那条线上执行你的操作。

【讨论】:

    【解决方案2】:

    fgetcsv() 对文件资源句柄进行操作,所以如果你想获得该行的位置,你可以fseek() 资源到该位置并正常使用fgetcsv()

    【讨论】:

      【解决方案3】:

      如果您在读取行之前不知道要查找哪一行,最好的办法是读取记录,直到通过测试返回的数组找到记录。

      $fp = fopen('data.csv', 'r');
      while(false !== ($data = fgetcsv($fp, 0, ','))) {
         if ($data['field'] === 'somevalue') {
            echo 'Hurray';
            break;
         }
      }
      

      如果您要读取特定行,请使用 splfile 对象并查找记录号。这将返回一个必须转换为数组的字符串

      $file = new SplFileObject('data.csv');
      $file->seek(2);
      $record = $file->current();
      $data = explode(",", $record);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-19
        • 2020-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多