3

これについてはすでに質問があったと思いますが、見つかりません。解決策が簡単すぎるかもしれません... とにかく、フラットファイルがあり、ユーザーが名前に基づいて値を変更できるようにしたいと考えています。モードを使用して新しい名前と値のペアを作成し、jQuery を使用してとfopen('a')で AJAX 呼び出しを送信する方法を既に整理しました。しかし、コンテンツが次のようになっているとします。newValuenewName

host|http:www.stackoverflow.com
folder|/questions/
folder2|/users/

そして今、私は値を変更したいと思いfolderます。なのでfolderasoldName/tags/asで送りますnewValue。値を上書きする最良の方法は何ですか? リスト内の順序は関係ありません。名前は常に左側にあり、その後に|(パイプ)、値、そしてnew-line.

私が最初に考えたのは、リストを読み取り、それを配列に格納し、すべての を検索し[0]、それに属する をoldName変更してから、ファイルに書き戻すことでした。[1]しかし、これを回避するより良い方法があると思いますか?何か案は?多分正規表現

4

2 に答える 2

9

非常に簡単な方法は、ファイル全体でstr_replace()を使用することです。

// read the file
$file = file_get_contents('filename.csv');
// replace the data
$file = str_replace('folder|oldValue', 'folder|newValue', $file);
// write the file
file_put_contents('filename.csv', $file);

これは、一度に1人のユーザーとしてのみ機能するはずです。しかし、データベースは常により良いアイデアです。CSVが必要な場合は、CSVファイルだけでなくDBからCSVへのスクリプトを追加することをお勧めします。

于 2010-05-31T14:37:45.507 に答える
5

APC などの PHP 機能を使用してリストをメモリに保持し、ときどきディスクに書き出すことができます。そうすれば、メモリに存在しない場合にのみ読み込むことができます。

パフォーマンスを重視したい場合、この情報を CSV に保存することは、おそらく最善の方法ではありません。真の RDMS (MySQL) を使用したくない場合は、SQLite を使用することをお勧めします。この場合、探しているすべての機能 (更新) を提供し、ハードドライブ上の単なるファイルであり、同時実行性がないという意味で、CSV とまったく同じように機能します。

それができない場合は、sed や awk などのシェル レベルのコマンドを使用してインラインで正規表現を変更する方法もあります。最後に、ファイル全体を文字列に読み取り、厄介な正規表現調整を実行して ( s///)、再度書き出すとうまくいきます。

于 2010-05-31T14:19:26.283 に答える