【问题标题】:PHP File_Get_Contents()PHP File_Get_Contents()
【发布时间】:2017-09-14 01:31:37
【问题描述】:

我有一个很长的文本文件(300 000 个字符),其中的数据用逗号分隔。

aaa,bbb,ccc,ddd,eee,ffff,gg,hhhhh,ii,j,kkkkkkkkkkkkk,l,mm

我想将数据填充到一个字符串中,但要按部分填充。例如,前 100 条数据,然后是下一条。请注意,每条数据的长度是不可预测的。

有没有快速的方法来做到这一点?我想将数据部分填充到字符串中,因为我不想一次使用太多内存。有点像一个循环:

for ($counter = 0; $counter < $somenumber; $counter++) {
// (1) extract counter-th 100 pieces of data to string
// (2) explode string with , as delimiter so I can obtain an array
// (3) do something to this array
}

我可以使用 file_get_contents 吗?或者我可以使用什么?

【问题讨论】:

  • 你可以试试explode()link我真的不知道它是怎么处理的,但是你可以得到一个字符串块数组并使用它们
  • 许多人忽略了问题的关键,即“请注意,每条数据的长度变化不可预测”。并且必须“分部分”加载字符串。问题:file_get_contents 需要知道第 100 个条目的结束位置 - file_get_contents 的第 4 个参数需要字符号。但是如何在不使用 strpos 的情况下获得该字符号(因为这会破坏目的,因为必须先加载整个字符串才能做到这一点)
  • 300k 个字符不是“非常长”的文件。但是,它足够长,我建议使用读取循环而不是一次将整个内容读入内存。

标签: php arrays string file iostream


【解决方案1】:

您可以使用 fread 批量读取文件,例如 8192Byte。

<?php
  $handle = fopen("filepath", "r");
  $content = '';
  $flag = false;
  while (!feof($handle)) {
    $content .= fread($handle, 8192);
    if(substr($content, -1) == ',')
      $flag = true;
    $array = explode(',', $content);
    if($flag)
    {
      $content = '';
    }
    else
    {
      $content = end($array);
      $array = array_pop($array);
    }
  }
  $array[] = $content;
  fclose($handle);

【讨论】:

    【解决方案2】:

    是的,您可以使用file_get_contents。之后,您可以使用explode http://php.net/manual/de/function.explode.php 将您的文件分解为多个部分。

    在你的情况下,使用:

    $result = explode(",", $your_file_content);
    

    您最终会得到一个数组,在$result[0] 中将是第一部分,直到您的第一个逗号,在$result[1] 中将是第二个,依此类推。意味着如果你有类似的东西:

    aaa,bbb,ccc,ddd,eee

    那么你将拥有:

    $result[0] // aaa
    $result[1] // bbb
    $result[2] // ccc
    $result[3] // ddd
    $result[4] // eee
    

    之后,您可以使用简单的外观将它们一起添加到字符串中。例如:

    for($a = 0; $a < 101; $a++) {
       $string .= $result[$a];
    }
    

    肯定这不会以这种方式工作,因为您的 $result 数组将有 100 多个条目,但是在第一个之外还有第二个 for-loop,您应该很快就能实现您正在尝试的目标。

    【讨论】:

    • php_explode 不是一个有效的函数,我猜它必须是explode :)
    • @C0dekid 谢谢,已编辑。链接和codesample已经可以了,只是名字不对。
    • @C0dekid 您错过了问题的关键,即“请注意,每条数据的长度变化不可预测。”并且必须“分部分”加载字符串。问题:file_get_contents 需要知道第 100 个条目的结束位置 - file_get_contents 的第 4 个参数需要字符号。但是如何在不使用 strpos 的情况下获得该字符号(因为这会破坏目的,因为必须先加载整个字符串才能做到这一点)
    猜你喜欢
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 2011-07-09
    • 2012-06-19
    • 2011-06-23
    • 2016-01-01
    相关资源
    最近更新 更多