ログファイルの中の空のデータ行を削除したい - PHPプロ!Q&A掲示板

3990

  • 0P

ログファイルの中の空のデータ行を削除したい

質問日時 / 2013年3月22日 18:16    回答数 / 6件

Questioner:  newbie  このエントリーをはてなブックマークに追加 

キーワード / ファイル処理    ログファイル   

初めて質問します。PHP歴1ヶ月の初心者です。

  1. $fp = fopen($fname, 'r');
  2. if ($fp) {
  3.   while (!feof($fp)) {
  4.     $line = fgets($fp, 10000);
  5.     $line = rtrim($line);
  6.     $data[] = explode('<>', $line);
  7.   }
  8.   fclose($fp);
  9. }
という感じでログファイルを読み込ませているのですが、読み込み時に、ログファイルの中の空のデータ行を削除するにはどうしたらいいでしょうか。

aaa<>bbb<>ccc<>ddd
<><><>
eee<>fff<>ggg<>hhh
<><><>
<><><>
というデータを
aaa<>bbb<>ccc<>ddd
eee<>fff<>ggg<>hhh
にしたいのです

よろしくお願いします


ツリー一覧

┣A01pannna正規表現使ったり色々とやり方はあると思いますが、
┃┗A01-1newbie>>pannnaさん 回答ありがとうございます。 実際の
┗A02shimixログのデータ個数(列数)が固定で、空のログが"<><><
 ┗A02-1newbie>>shimixさん 回答ありがとうございます。 >ログ
  ┗A02-1-1shimix>データ個数によらずに最初の6文字に<><><>が入ってい
   ┗A02-1-1-1newbie>>shimixさん なんとか希望の動作をするようになりま

回答一覧

並び替え:

A01 参考になった
answererpannna [3月22日 21:18] (最終編集:3月22日 21:20)

正規表現使ったり色々とやり方はあると思いますが、
分かりやすい例だとこのような感じでしょうか。

$data = array();
if(strlen(str_replace(array('<', '>'), array('', ''), $line)))
{
  $data[] = $line;
}
var_dump($data);

ただし、上の例では'<'と'>'を無条件で0長文字に変換してしまっているので、
'<><<<<>>>><><>'のような文字列も削除対象となります。
'<>'を削除したいのであれば、str_replace関数の第1引数と第2引数をあわせて
変更してください。

# ちなみにexplodeは何のために使ってるんでしょうか…?

この意見に回答する

ツリーへ TOPへ

A01-1
replyernewbie [3月22日 23:12] (最終編集:3月22日 23:13)

>>pannnaさん
回答ありがとうございます。

実際のログファイルは50項目近いものが<>区切りであります。
explodeはこの後配列の各要素、例えば46番目にあった要素を44番目に移動などの作業の為ですので、
<>を全て削除してしまうとその処理が出来なくなりそうです。

この意見に回答する

ツリーへ TOPへ

A02 満足
answerershimix [3月22日 22:50] (最終編集:3月22日 22:50)

ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば

if ($line === "<><><>") { continue; }

で読み飛ばしてもいいのでは?


#そもそも「空のログを書き込んでいる」部分をどうにかすべきですが(汗

この意見に回答する

ツリーへ TOPへ

A02-1
replyernewbie [3月22日 23:12]

>>shimixさん
回答ありがとうございます。

>ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば

>if ($line === "<><><>") { continue; }

なるほど、ではデータを読み込む際に、データ個数によらずに最初の6文字に<><><>が入っていた場合は要削除行ということであれば、
if(substr($line, 0, 6) === "<><><>") { continue; }
として、その行の読み込み処理をスキップするという感じでしょうか。

この意見に回答する

ツリーへ TOPへ

A02-1-1 参考になった
replyershimix [3月23日 18:06] (最終編集:3月23日 18:07)

>データ個数によらずに最初の6文字に<><><>が入っていた場合は
>要削除行ということであれば、

最初の3列が「必須」であればいいです(最初の3個が空だったら無視していいという条件)。

私が書いたのは「個数が固定」であれば、その個数分でチェックすればいいだろうという話です。たとえば個数が $num と決まっていれば、あらかじめ

$checkstr = implode('<>', array_fill(0, $num, ""));

とでもして『すべての数値が空だったときにファイルに書き込まれているであろう文字列』を生成しておいて、その文字列とチェックすればいいんじゃないかと。

explodeした結果の配列がすべて空文字列かどうかをチェックするよりは、文字列比較1回で済ませた方が効率的だと思います。

この意見に回答する

ツリーへ TOPへ

A02-1-1-1
replyernewbie [3月24日 02:42]

>>shimixさん
なんとか希望の動作をするようになりました。

ありがとうございました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)

Q&A掲示板 新着情報