2017-04-24 51 views
-1

我试图搜索文本文件,如果某一行包含特定的密钥ID,我想更新整行,如果不添加新行。PHP在文本中添加或编辑行文件

因此,基于这个文本文件:

admin,1234,ID1345,NW 
staff,1325,ID1001,NE 
staff,2157,ID2003,SW 
staff,8519,ID3001,NS 

我要搜索ID1345,然后只更新该行,其他行留,正是因为他们的。如果没有行包含ID1345,则在文本文件中添加一行。

到目前为止我有:

$search = 'ID1345'; 
$result = 'admin,6698,ID1345,OP'; 

$reading = fopen('myfile', 'r'); 
$writing = fopen('myfile.tmp', 'w'); 
$replaced = false; 

while (!feof($reading)) { 
    $line = fgets($reading); 
    if (stristr($line, $search)) { 
    $line = "$result\n"; 
    $replaced = true; 
    } 
    fputs($writing, $line); 
} 

if (!$replaced) fputs($writing, "$result\n"); 
fclose($reading); fclose($writing); 
rename('myfile.tmp', 'myfile'); 

这似乎为找工作和更换,但如果该行不存在,它不断增加它不只是一次。

我知道这是由于if (!$replaced)行,但我不知道如何做到这一点。

上面的例子虽小,但有可能是文件中的几千项..

感谢

+2

备注:是否有一个特殊/特定的原因,为什么你不使用数据库呢?文本文件非常有用。 –

+0

也许指针不在正确的位置。测试它。移动'fclose()'下的'if($ repl ..)'行并使用if($ repl ..)file_put_contents('myfile.tmp','$ result \ n',FILE_APPEND);' – JustOnUnderMillions

+0

do你的意思是,当你只运行一次这个脚本时,或者只有当你使用同一个文件运行多次时,它才会继续添加它?如果第二种情况,也许它可能是新行字符不被识别?在手册中推荐使用'wb'而不是''w'带'fopen'来实现可移植性和新的字符串。 – Kaddath

回答

0
function file_properties($fileProperties) { 
$result = array(); 
$lines = split("\n", $fileProperties); 
$key = ""; 
$isWaitingOtherLine = false; 

foreach($lines as $i=>$line) { 
    if(empty($line) || (!$isWaitingOtherLine && strpos($line,"#") === 0)) continue; 

    if(!$isWaitingOtherLine) { 
     $key = substr($line,0,strpos($line,'=')); 
     $value = substr($line,strpos($line,'=') + 1, strlen($line)); 
    } else { 
     $value .= $line; 
    } 

    /* Check if ends with single '\' */ 
    if(strrpos($value,"\\") === strlen($value)-strlen("\\")) { 
     $value = substr($value, 0, strlen($value)-1)."\n"; 
     $isWaitingOtherLine = true; 
    } else { 
     $isWaitingOtherLine = false; 
    } 

    $result[$key] = $value; 
    unset($lines[$i]); 
} 

return $result; 

}

这将读取和写入值与任何到文件在Laravel等扩展名为.env或任何* .properties在Java

+0

Java ???????????? –

+0

就像Java你试过并实现它 –