我需要一个脚本来查找然后替换CSV文件中的一条线。 该文件如下所示:
18:110327,98414,127500,114185,121701,89379,89385,89382,92223,89388,89366,89362,89372,89369
21:82297,79292,89359,89382,83486,99100
98:110327,98414,127500,114185,121701
24:82297,79292,89359,89382,83486,99100
现在我需要改变第21行。
这是迄今为止我所看到的。
前2到4位数字:ar a catergory number。此后的每个数字(后跟a,)都是页面的id。 我从数据库中访问了我想要的(即82297等)。
//test 2
$sQry = "SELECT * FROM artikelen WHERE adviesprijs <>''";
$rQuery = mysql_query ($sQry);
if ( $rQuery === false )
{
echo mysql_error ();
exit ;
}
$aResult = array ();
while ( $r = mysql_fetch_assoc ($rQuery) )
{
$aResult[] = $r['artikelid'];
}
$replace_val_dirty = join(",",$aResult);
$replace_val= "21:".$replace_val_dirty;
// file location
$file='../../data/articles/index.lst';
// read the file index.lst
$file1 = file_get_contents($file);
//strip eerde artikel id van index.lst
$file3='../../data/articles/index_grp21.lst';
$file3_contents = file_get_contents($file3);
$file2 = str_replace($file3_contents, $replace_val, $file1);
if (file_exists($file)) {
echo "The file $filename exists";
} else {
echo "The file $filename does not exist";
}
if (file_exists($file3)) {
echo "The file $filename exists";
} else {
echo "The file $filename does not exist";
}
// replace the data
$file_val = $file2;
// write the file
file_put_contents($file, $file_val);
//write index_grp98.lst
file_put_contents($file3, $replace_val);
mail('info@', 'Aanbieding catergorie geupdate', 'Aanbieding catergorie geupdate');
有人能指出我正确的方向吗? 任何帮助将不胜感激。
答案 0 :(得分:2)
您需要打开原始文件并浏览每一行。当您找到要更改的行时,请更改该行。
由于在执行此操作时无法编辑文件,因此在执行此操作时编写临时文件,因此逐行复制,如果行需要更改,则更改该行。
完成整个文件后,将临时文件复制到原始文件。
示例代码:
$path = 'file';
$category = 21;
$articles = [111182297, 79292, 89359, 89382, 83486, 99100];
$prefix = $category . ':';
$prefixLen = strlen($prefix);
$newLine = $prefix . implode(',', $articles);
这部分只是设置基础:文章的类别,ID,然后构建相关的字符串。
现在打开文件以更改以下行:
$file = new SplFileObject($path, 'r+');
$file->setFlags(SplFileObject::DROP_NEW_LINE | SplFileObject::SKIP_EMPTY);
$file->flock(LOCK_EX);
文件已被锁定,因此在更改文件时,其他任何进程都无法编辑该文件。在该文件旁边,还需要临时文件:
$temp = new SplTempFileObject(4096);
设置完两个文件后,让我们查看$file
中的每一行并比较是否需要更换:
foreach ($file as $line) {
$isCategoryLine = substr($line, 0, $prefixLen) === $prefix;
if ($isCategoryLine) {
$line = $newLine;
}
$temp->fwrite($line."\n");
}
现在$temp
orary文件已包含已更改的行。请注意,我使用了UNIX类型的EOF(End Of Line)字符(\n
),具体取决于具体的文件类型,这可能会有所不同。
现在,需要将临时文件复制到原始文件。让我们回放文件,截断它然后再写下所有行:
$file->seek(0);
$file->ftruncate(0);
foreach ($temp as $line) {
$file->fwrite($line);
}
最后你需要解锁:
$file->flock(LOCK_UN);
就是这样,在$file
中,该行已被替换。
一次举例:
$path = 'file';
$category = 21;
$articles = [111182297, 79292, 89359, 89382, 83486, 99100];
$prefix = $category . ':';
$prefixLen = strlen($prefix);
$newLine = $prefix . implode(',', $articles);
$file = new SplFileObject($path, 'r+');
$file->setFlags(SplFileObject::DROP_NEW_LINE | SplFileObject::SKIP_EMPTY);
$file->flock(LOCK_EX);
$temp = new SplTempFileObject(4096);
foreach ($file as $line) {
$isCategoryLine = substr($line, 0, $prefixLen) === $prefix;
if ($isCategoryLine) {
$line = $newLine;
}
$temp->fwrite($line."\n");
}
$file->seek(0);
$file->ftruncate(0);
foreach ($temp as $line) {
$file->fwrite($line);
}
$file->flock(LOCK_UN);
应该使用PHP 5.2及更高版本,我使用PHP 5.4数组语法,如果你使用PHP 5.2 / 5.3,可以用[111182297, ...]
替换array(111182297, ...)
。