1

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 桁の後に : が続くものがカテゴリ番号です。この後のすべての数字 (その後に , が続く) は、ページの ID です。データベースから必要な 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');

これを行うために誰かが私を正しい方向に向けることができますか? どんな助けでも大歓迎です。

4

1 に答える 1

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);

2つのファイルを設定したら、の各行を$file調べて、置き換える必要があるかどうかを比較してみましょう。

foreach ($file as $line) {
    $isCategoryLine = substr($line, 0, $prefixLen) === $prefix;
    if ($isCategoryLine) {
        $line = $newLine;
    }
    $temp->fwrite($line."\n");
}

これで、$temporaryファイルにはすでに変更された行が含まれています。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, ...)

于 2012-09-23T21:21:00.113 に答える