![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
やりたいことは、"ファイルAを読み取り、その内容に処理を施したものをファイルBに書き込むという処理"です。
その上で、"ファイルBに書き込んだ内容を書き込みと同時に読み取り、
その上である条件にマッチした文を書き換える"といったことを実現したいです。
もともとのファイルの容量が非常に大きいので、何度もループを使うといったことはなるべく避けたいため、
ファイルBの書き込み・読み込み・書き換えを同時に行いたいのですが、
そもそもそういったことは可能なのでしょうか。
※また、もともとのファイルの容量が非常に大きいので配列を使わず行う、
ということが前提条件としてあります。
現在のスクリプトの簡略化したものが以下となります。
open LOGFILE,"< /○○/ファイルA" || die("die");
open NEWLOG,"+< /△△/ファイルB" || die("die");
$new = <NEWLOG>;
while($yomitori = <LOGFILE>){
if(ある条件1){
print NEWLOG "$kakikomi\n";
}
if(ある条件2){
ファイルBの書き換えの処理
$new =~s/\n/ $kakikae\n/;
print NEWLOG "$new";
}
}
close(NEWLOG);
close(LOGFILE);
上記スクリプトで、ファイルAからファイルBへの書き込み、ファイルBの読み取りまではできておりますが、
ファイルBの書き換えは実現しておりません。
以上、お詳しい方がいらっしゃいましたら宜しくお願い致します。
No.2ベストアンサー
- 回答日時:
補足読みました。
そういうことなら、処理毎にログをまとめるのがいいでしょう。
ファイルAをそのまま読みこむのではなく、予め処理毎に分割、あるいは、並び換えたものを読み込むのはどうでしょうか?
UNIX系のコマンドが使える環境なら、 sort や grep で処理毎にまとめて、それをパイプラインで読み込む、等
一時ファイルを間に挟み、希望するログファイルに近いファイル作成に成功しました。
あとは、ちょっとした修正と、処理速度(現状、希望する速度には程遠いので。。)を上げていきます。
grepによりログが重複しないようにはしておりますが、sortをうまく使えておりませんので
どう有効活用できるか煮詰めたいと思います。
ありがとうございました!
No.3
- 回答日時:
>やりたいことは、"ファイルAを読み取り、その内容に処理を施したものをファイルBに書き込むという処理"です。
>その上で、"ファイルBに書き込んだ内容を書き込みと同時に読み取り、
ちょっと意味が分からないのですが、Aを加工してBに保存したあと、またBを読み込む必要があるんですか?
非常に大きいファイルがどの程度なのかと、
一番大事なのは、処理をしなければならないスパンがどの程度なのかですね。
ファイルの大部分を読み込まないと処理が出来ないのか、小さな1行程度に分けられていて、
1行あればそれで処理と判断が付くのか。
大きいファイルと言っても、
100M程度大きさなら、読み込み用、中間処理用、書き込み用と3つに分裂させてもメモリ消費量は300M程度で、たぶんですが今開いてるブラウザのほうが重いですね。
実際にはどの程度のファイルなのかは分かりませんけども。
それにどうせ、バッファはフラッシュしないと、どんどんたまって行きます。
(実際に出力するのはことが終わったあとに一気におこなわれ、当然出力すべき全ログはメモリに記憶されます)
フラッシュしてもバグの元(ファイルを壊す元)なのでやらないほうがいいだろうと思いますけど。
とりあえず、
while (<IN>){}
の処理は見た目どおり1行づつ読み捨てているので、
適度に改行が入ってるファイルなら、読み込みによる影響でメモリは消費しないものと思われます。
ファイルAとファイルBの関係がよく分からないのですが、
両方のファイルを併せて処理手順が書かれているんでしょうか?
そしてその処理によって、ファイルBを書き換えるんでしょうか?
だとするならば、ファイルはもう一つ用意するのが普通です。
Bをいろいろなことに使いすぎじゃないでしょうか。
>一番大事なのは、処理をしなければならないスパンがどの程度なのかですね。
ファイルAは最大で5~600MB程度だと予測しておりますが、1分ごとにファイルAを処理し、ファイルBを少しづつ作成していく処理を考えております。
容量の大きいファイルも扱い方次第ということを教えていただきありがとうございます!
>Bをいろいろなことに使いすぎじゃないでしょうか。
そうですよね、柔軟に考えることができませんでした。。もっと経験をつみがんばります。
いろいろ丁寧に教えていただきありがとうございます!
No.1
- 回答日時:
Bに書く前に、文字列を操作すればいいのでは?
if(ある条件1){
#ここでは書き込まず
#print NEWLOG "$kakikomi\n";
if(ある条件2){
# 内容を変更
$kakikomi =~s/\n/ $kakikae\n/;
}
# 変更したものを書き込む
print NEWLOG "$kakikomi";
}
具体的な条件が書いてないので、このまま使えるかどうかはわかりませんが。
あるいは、一旦 一時ファイルを経由させるとか
A → 一時ファイル → B
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- PDF acrobatでwordファイルをpdfに変換すると文字化けする 3 2023/02/10 09:31
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- フリーソフト Windowsの特殊文字を削除や変換したい そんなフリーソフトはありますか? 3 2022/11/09 00:05
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
C言語のfopenについて教えてく...
-
C言語関数違いについて。
-
機械学習初心者です。 本を読み...
-
csvファイルを開かずに文字を検...
-
fopenできる上限の変更
-
Access2010の最適化設定について
-
テキストファイルの最終行を削...
-
分割コンパイルの#defineについて
-
fopen 中のエラー
-
HTMLファイルをメモ帳から開きたい
-
CSVファイルへの保存の際、デー...
-
ファイル名の先頭にアンダース...
-
ピクチャボックス, PaintPictur...
-
マクロを作成したファイルを立...
-
グローバル変数のよくない使い...
-
XMLファイルの表示について
-
特定のファイルを作成している...
-
C#で、フォームのタイトル名を...
-
iniファイルに追記がしたいです。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
バッチで118項目のCSVを処理し...
-
テキストファイルの最終行を削...
-
CSVファイルへの保存の際、デー...
-
SGファイルって何ですか?
-
大きいサイズのテキストファイ...
-
ドラッグアンドドロップでファ...
-
分割コンパイルの#defineについて
-
グローバル変数のよくない使い...
-
iniファイルに追記がしたいです。
-
Excelマクロでの再読込み方法
-
C言語のfopenについて教えてく...
-
ハッシュの計算時間について
-
VBAにてEXCEL以外のファイル(テ...
-
Javascript で INI の読み書き
-
同じ名前のファイルを作った場...
-
ASP .NETでファイル選択ダイア...
-
VBに、Cのincludeのようなもの...
おすすめ情報
回答ありがとうございます!
処理の説明不足すみません。。
ログの編集なのですが、以下のようなものになっています。
<ファイルA>
処理Aのうちの動作1
処理Bのうちの動作1
処理Bのうちの動作2
処理Aのうちの動作2
処理Cのうちの動作1
処理Bのうちの動作3
処理Aのうちの動作3
処理Cのうちの動作2
・
・
上記のように、ある処理は複数の動作で成り立っており、各動作に法則性はありません。
各処理の各動作を処理毎にまとめる動きを実現したいです。
イメージとして以下のようなログです。
<ファイルB>
処理A 動作1 動作2 動作3
処理B 動作1 動作2 動作3
処理C 動作1 動作2 動作3
処理D 動作1 動作2 動作3
・
・
そこで第一段階で
処理A
処理B
処理C
・
・
第二段階で
処理A 動作を付加(置換)
処理B
処理C
・
・
のようにしています。
一時ファイルを作るやり方で探ってみます。
と同時に、各処理に各動作を付加する回数分だけ一時ファイルを作成する必要があるのかも?と思っており、ログの処理数は膨大なものになっているため現実的ではない?とも思っております。
当方初心者なもので的外れであればスミマセン。。
ロジックを練り直したいと思います。