【问题标题】:Re-arranging lines in a file重新排列文件中的行
【发布时间】:2012-02-03 08:27:40
【问题描述】:

我正在尝试从文本文件中读取数据并将其分配给数组。我怎样才能一次准确地读取 3 行,然后将第一行分配给数组 $a,第二行分配给数组 $b,第三行分配给数组 $c?然后再读 3 行,等等。

【问题讨论】:

标签: php arrays file input io


【解决方案1】:
$lines    = file('some_file.txt');
$numLines = count($lines);

for ($i = 0; $i < $numLines; $i += 3) {
    $a[] = $lines[$i];
    $b[] = $lines[$i + 1];
    $c[] = $lines[$i + 2];
}

请注意,您还需要进行一些越界索引错误检查。我把它作为 OP 的练习。

【讨论】:

  • 最好使用fgets从文件中流式传输数据而不是缓冲它...
  • @WillVousden:我想这取决于正在读取的文件的平均大小,以确定流式传输是否会产生任何明显的差异,但没有提供该信息。
【解决方案2】:

【讨论】:

    【解决方案3】:

    你可以使用这样的例子:

    $lines = file('filename');
    $chunks_array = array_chunk($lines, 3)); - this create array of arrays with 3 lines each
    
    foreach ($chunks_array as $chunks)
    {
        $a[] = $chunks[0];
        $b[] = $chunks[1];
        $c[] = $chunks[2];
    }
    

    【讨论】:

      【解决方案4】:

      曾经我遇到过类似的问题。我这样解决(在伪代码中)。

      counter = 1;
      
      while reading
      switch counter
      case 1: store in the first array then break;
      case 2: store in the second array then break;
      case 3: store in the third array, counter = 0, then break;
      
      counter++;
      
      end-while
      

      【讨论】:

        【解决方案5】:

        您可以使用 fseekfile_get_contents 与 maxlen 参数。但是要准确地阅读 3 行,我实际上并不知道,除非你知道这些行有多长。

        函数file 将所有行读入一个数组。

        编辑两个: 可以逐字节读取文件(尽管从我的角度来看这是一个坏主意)并在遇到每个 \nPHP_EOL 并使用计数器或其他任何东西来管理它的使用方式后停止。

        编辑一个:

        我刚刚有了这个想法:您可以创建一个自定义流包装器,并用它来处理您读取的 3 行 3 行。它是一个很棒的文件工具,检查http://www.php.net/manual/en/class.streamwrapper.php,并通过上下文或变量或其他方式控制它。

        我猜你仍然需要为此找到一个算法。我还没有尝试过,但如果你能处理,请告诉我们。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-06
          • 1970-01-01
          • 2015-08-28
          • 1970-01-01
          • 2022-11-04
          • 1970-01-01
          • 2021-12-28
          • 1970-01-01
          相关资源
          最近更新 更多