2017-04-24 96 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你試過並實現它 –