文件操作搜索并替换csv php

时间:2012-09-23 20:16:01

标签: php csv replace

我需要一个脚本来查找然后替换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');

有人能指出我正确的方向吗? 任何帮助将不胜感激。

1 个答案:

答案 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, ...)