如何在文本文件中展开一行,并使用PHP为其第二部分写一个新值

时间:2012-11-18 08:56:57

标签: php text explode writetofile

我正在尝试在“=”之后更改文本文件中的值,explode返回一个包含两个元素的数组,我希望第二个元素替换为新值,然后写入我的文件中,但我迷路了语法!!

 $trID_Log_File = $fileName;
 if(file_exists($trID_Log_File) && filesize($trID_Log_File) > 0) 
   {    
    $h = fopen($trID_Log_File, "r");
    $contents = fread($h, filesize($trID_Log_File));
    fclose($h);

    if(!stristr($contents, "TrID is best suited to analyze binary files!")) 
    {

        $lines = explode("\n", $contents);
        foreach($lines as $line) 
        {
            if(strlen($line) > 5) 
            {
                $line_arr=explode("=",$line);

                                    if ($line_arr[0]=='Sally')
                                    {
                  $line_arr[1]="10"; // The New Value // ??????
                                       fwrite($h,$line_arr,"w+")     ; // ?????????
                                   }
            }
                 }
     }
   }

输入:

sally= 10
samy=40

所需的输出:

sally=55
samy=123 

这个问题的正确语法是什么!! 我错过了一些代码吗? 感谢

2 个答案:

答案 0 :(得分:0)

这是一个有效的代码:

<?php
if(file_exists($trID_Log_File) && filesize($trID_Log_File) > 0)  {    
  $h = fopen($trID_Log_File, "r");
  $contents = fread($h, filesize($trID_Log_File));
  fclose($h);
  $out_h = fopen("output filename", "w");    
  if(!stristr($contents, "TrID is best suited to analyze binary files!")) {
    $lines = explode("\n", $contents);
    foreach($lines as $line) {
      if(strlen($line) > 5) {
        $line_arr=explode("=",$line);      
        if ($line_arr[0]=='Sally') {
          $line_arr[1]="10"; // The New Value 
        }
        fwrite($out_h, implode("=", $line_arr)."\n"); 
      }
    }
  }
}

您的代码中存在多个错误。首先,您正在尝试将数组写入文件,但您应该使用implode函数将其转换回带有=分隔符的字符串。

其次,你使用fwrite完全错误。这个函数的第一个参数必须是打开文件处理程序,但是你已经通过了关闭的一个。第二个参数必须是要写的字符串,您已经传递了一个数组。第三个可选参数是length,但是你已经传递了“w +”,这对fwrite没有任何意义。 fwrite无法打开文件,因此无法使用文件访问修饰符。

第三,您无法修改文件以实现您的任务。如果必须这样做,则必须将文件光标设置为每行的开头,然后用新内容覆盖该行。如果新线的长度不等于旧线的长度,则变得非常复杂。因此,您应该创建另一个输出文件并将所有输出写入其中。

我发布的代码中还有其他一些问题:

  • 这对大文件不起作用。如果它应该,你不能将整个文件加载到内存中。使用fgets读取一行,处理它,将其写入新文件,然后读取下一行。
  • 不包含'Sally'的行不会包含在输出文件中。您可能想要更改此行为。

另外,我没有检查stristr条件,所以我不知道它是否有效。

所有这些都不是关于语法的。如果存在任何语法错误,解释器会非常具体地告诉您语法错误。

答案 1 :(得分:-1)

if(strlen($line) > 5) {
$line_arr=explode("=",$line);

if ($line_arr[0]=='Sally'){
    $line_arr[1]="10"; // The New Value // ??????
    $new_line = implode("=", $line_arr); //reconstruct the string here
    // or something like that :
    // $new_line = $line_arr[0] . "=10";
    fwrite($h,$new_line)     ; // ?????????
}
}

在写入文件之前,在数组上使用implode。如果没有,你试图写一个数组到文件...你必须在之前重建字符串!