我有一个名为$dir
的文件和一个名为$line
的字符串,我知道这个字符串是该文件的完整行,但我不知道它的行号,我想删除它从文件中,我该怎么办?
是否可以使用awk?
答案 0 :(得分:18)
逐行读取行,并将匹配行以外的所有行写入另一个文件。然后替换原始文件。
答案 1 :(得分:11)
这将只查看每一行,如果不是你要删除的内容,它将被推送到一个将被写回文件的数组。 see this
$DELETE = "the_line_you_want_to_delete";
$data = file("./foo.txt");
$out = array();
foreach($data as $line) {
if(trim($line) != $DELETE) {
$out[] = $line;
}
}
$fp = fopen("./foo.txt", "w+");
flock($fp, LOCK_EX);
foreach($out as $line) {
fwrite($fp, $line);
}
flock($fp, LOCK_UN);
fclose($fp);
答案 2 :(得分:10)
$contents = file_get_contents($dir);
$contents = str_replace($line, '', $contents);
file_put_contents($dir, $contents);
答案 3 :(得分:3)
另一种方法是逐行读取文件,直到找到匹配项,然后将文件截断到该点,然后附加其余行。
答案 4 :(得分:2)
如果您要在一行中查找子字符串(ID)并想要用新行替换旧行,这也很好。
<强>代码:强>
$contents = file_get_contents($dir);
$new_contents= "";
if( strpos($contents, $id) !== false) { // if file contains ID
$contents_array = preg_split("/\\r\\n|\\r|\\n/", $contents);
foreach ($contents_array as &$record) { // for each line
if (strpos($record, $id) !== false) { // if we have found the correct line
pass; // we've found the line to delete - so don't add it to the new contents.
}else{
$new_contents .= $record . "\r"; // not the correct line, so we keep it
}
}
file_put_contents($dir, $new_contents); // save the records to the file
echo json_encode("Successfully updated record!");
}
else{
echo json_encode("failed - user ID ". $id ." doesn't exist!");
}
示例:强>
输入:&#34; 123,学生&#34;
旧文件:
ID,职业
123,学生
124,砖层
运行代码会将文件更改为:
新文件:
ID,职业
124,砖层
答案 5 :(得分:2)
可以在不使用awk的情况下解决:
function remove_line($file, $remove) {
$lines = file($file, FILE_IGNORE_NEW_LINES);
foreach($lines as $key => $line) {
if($line === $remove) unset($lines[$key]);
}
$data = implode(PHP_EOL, $lines);
file_put_contents($file, $data);
}
答案 6 :(得分:0)
像这样:
file_put_contents($filename, str_replace($line . "\r\n", "", file_get_contents($filename)));
答案 7 :(得分:0)
我认为处理文件的最佳方法是将它们编辑为字符串。
首先,获取文件的所有行(以下代码可以压缩):
$file = @fopen($dir, 'r'); # As you said, $dir is your filename
if ($file) { # Ending bracket is at the end
if (filesize($dir)) { # Checks whether the file size is not zero (we know file exists)
$fileContent = fread($file, filesize($dir)); # Reads all of the file
fclose($file);
} else {
// File is empty
exit; # Stops the execution (also you can throw an exception)
}
$fileLineByLine = explode(PHP_EOL, $fileContent); # Divides the file line by line
在这里,您可以执行搜索:
$key = false; # By default, your string $line is not in the file (false)
foreach ($fileLineByLine as $lineNumber => $thisLine)
if ($thisLine === $line)
$key = $lineNumber; # If $line found in file, set $key to this line number
简单地说,您可以删除行$ key + 1:
if ($key !== false) # If string $line found in the file
unset($fileLineByLine[$key]); # Remove line $key + 1 (e.g. $key = 2, line 3)
最后,您必须将更改保存到文件中:
$newFileContent = implode(PHP_EOL, $fileLineByLine); # Joins the lines together
$file = fopen($dir, "w"); # Clears the file
if ($file) {
fwrite($file, $newFileContent); # Saves new content
fclose($file);
}
} # Ends 'if ($file) {' above
您也可以将上面的代码设置为函数。
注意:
$ line不能包含\ n等换行符。你必须删除它们:
$line = str_replace(PHP_EOL, '', $line);
请勿使用
$fileLineByLine[$key] = "";
而不是
unset($fileLineByLine[$key]);
因为第一种情况不会删除该行,它只会清除该行(并且将保留不需要的空行)。在这种情况下,implode()也为$ fileLineByLine [$ key]添加一个新行,该行为空;否则如果你取消设置变量,它将不可用(并且implode()找不到它。)
答案 8 :(得分:0)
将文本转换为数组,删除第一行并重新转换为文本
$line=explode("\r\n",$text);
unset($line[0]);
$text=implode("\r\n",$line);