• 締切済み

Perl テキスト ブログ

ホームページにブログを設置を考えています。 どうかご教示お願い致します。 今考えていることは サイドにある記事のカテゴリ別や最新順といったものを表示することです。 最新順はできたのですが、 カテゴリ別が、うまいこといかないです。 テキストファイル内は No(カテゴリ),日付,タイトル,本文,画像名 となってます open(IN,$FILE); @DATA = <IN>; close IN; で$FILEを開き そこから、 カテゴリ別の(No.1の場合) $a = 0; my @match = grep(/^1,/, @DATA); while (<@match>) { $a++; } でカテゴリ1に絞込 カテゴリ1の合計値と元あった行Noを 求めたいのですが、 どのようにすればいいのでしょうか?

  • Perl
  • 回答数1
  • ありがとう数0

みんなの回答

  • kichi8000
  • ベストアンサー率41% (658/1580)
回答No.1

連想配列で振り分けた方がやりやすいのは今書きません。 #変数末尾に行番号文字を追加する for ($i=0; $i<@DATA; $i++) { $DATA[$i] .=",$i" ; } $b = ""; my @match = grep(/^1,/, @DATA); $a = $#match+1; while (<@match>) { #抽出 No(カテゴリ),日付,タイトル,本文,画像名,行No (,,,,,$nums ) = split /,/, $_; #行Noをカンマ区切りで追加 $b .= "$nums,"; } #行末の,を削除 chop($b); #~~~$a,$b print "$a:$b"; 検証はしていません。

関連するQ&A

  • Perl 処理速度について

    ブログを作成し、カテゴリー別に分けたく下記のようなソースを 書きました。 sub category1 { open(FILE, "<$FILE") or die("error :$!"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; $a = 0; my @category1 = grep(/,1,/, @DATA); while (<@category1>) { $a++; } &buffer(); if($start > @DATA) {$start = @DATA;} $next = $start + 100; $back = $start - 100; if ($back < 0) { $back = 0; } for ($i=$start;$i<$next;$i++){ last if ($i > @category1); $data = $category1[$i]; &page(); } } これの処理速度が遅いのですが、なにか原因はありますでしょうか? 似たような処理で下記のソースの方が、読み込む内容としては多いのですが、 こちらは普通の速度です。 sub diary2017 { open(FILE, "<diary/diary-2017.txt") or die("error :$!"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; &buffer(); if($start > @DATA) {$start = @DATA;} $next = $start + 1000; $back = $start - 1000; if ($back < 0) { $back = 0; } for ($i=$start;$i<$next;$i++){ last if ($i > @DATA); $data = $DATA[$i]; &page(); } } カテゴリーのサブルーチンとアーカイブ専用のサブルーチンで違う点といえば $a = 0; my @category1 = grep(/,1,/, @DATA); while (<@category1>) { $a++; } このgrepのとこですが、 これが遅いとすると対処方法はありますか? ※開くファイルはアーカイブは直接名前にしてて、カテゴリーは変数を使ってますが  これは同じです。

    • ベストアンサー
    • Perl
  • perlでテキストデータの指定行に書き込み

    たびたびお世話になります。 データには、「データNO」「登録NO」「名前」「カテゴリー」「金額」が登録されています。 もともとあったデータをフォームで編集、送信してデータNO($d_no)と一致した行だけを書替え(上書き)したいんですが、どうしても方法がわかりません。 open(IN,"../save_data/sdeta.txt"); @data = <IN>; close(IN); foreach(@data){ chop($sdata); ($d_no,$s_no,$s_name,$d_class,$s_price) = split (/=/, $sdata); if( $value eq $d_no){ $sdata="$in{'d_no'}=$in{'s_no'}=$in{'s_name'}=$in{'d_class'}=$in{'s_price'}\n"; }else{ $sdata="$d_no=$s_no=$s_name=$d_class=$s_price\n" } } open(OUT,">../save_data/sdeta.txt") || &error("オープンエラー"); print OUT @data; close(OUT); 上のプログラムを書いても、書替えできませんでした。 どのように直せば一行のみの書替えが出来るんでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • Perl
  • テキストファイルの高速な読み込みは?

    1つのテキストファイル(5~10KB)を一度に変数に読み込むために、 open(IN, $file); my $data = join('',<IN>); close(IN); と、 my $data; open(IN, $file); while(<IN>){ $data .= $_ } close(IN); の2つを比較していたのですが、自分がベンチマークをとった限りでは後者の方が速いみたいです。これより早い方法はないでしょうか?

    • ベストアンサー
    • Perl
  • perlで検索 カンマ n番目

    ~log.txt~ 1,a,w,e,r 2,a,w,e,r 2,e,a,v,ssss 3,s,ssss,a,a $FILE = 'log.txt'; $Search = 'sss'; ~Search.pl~ open(FILE, "<$FILE") or die("error :$!"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; $a = 0; my @Search = grep(/$Search,/, @DATA); while (<@Search>) { $a++; } print "@Search\n"; このようなデータで 検索ワード=sssのとき ヒットするのが 2,e,a,v,ssss 3,s,ssss,a,a [0][1][2][3][4] この2つです。 ここまではいいのですが、 2番目のsssのみを取り出したいとき my @Search = grep(/$Search,/, @DATA); ここをどのように変えればいいのでしょうか・・・?

    • ベストアンサー
    • Perl
  • Perlでテキストファイル読み込み

    基本的な質問ですみません。 サーバ上のテキストファイルを読み込んで ローカルのテキストファイルに書き込むというだけなのですが 何度やってもできません。 以下プログラムですが #!usr/bin/perl open(IN,"http://*****/***/***.txt"); $file = <IN>; close(IN); open(OUT,"> a.txt"); print(OUT "$file"); close(OUT); サーバのアドレスは、URLうってみて見れたのでhttp://***(以下略)であってると思います。 サーバのテキストにはchmodで777と権限を与えました。 プログラムに問題あるのでしょうか。 この場合考えられる原因を教えてください。

    • ベストアンサー
    • Perl
  • dで始まる行を別のファイルの末尾に書き込む

    いつもお世話になります。 「あるテキストファイルから順に行を読み込んで、 d で始まる行がマッチしたら、別のファイルの末尾の行に加えていく」、 というプログラムを書きたいのです。 下記のように書いてみたのですが、うまく動きません。どのように修正すれば動きますか? #!/usr/bin/perl open ADD, ">>jobs_done"; open IN, "jobs_tobedone"; while ($input = <IN>){ if (/^d/){ print ADD $input; } } close ADD; close IN; ぜひ知恵を貸してください。

    • ベストアンサー
    • Perl
  • PerlでのCSV書き込みについて質問です。

    perl初心者です。 perlで投票のプログラミングを作ってるのですが、 どうもうまく動きません。 やりたいことは ・投票されたら  1)csvを読み込む  2)該当するNOのカウントをアップ  3)csvに書き込む という単純なことなのですが、 投票してもカウンタは0のままになってしまいます。 書き込み部分のプログラムが間違っているとは思うのですが 何が間違っているのかがどうしてもわかりません。 どなたかお知恵を貸してくださいm(__)m プログラムは下記のようになっています。 ================= foreach my $key (@key) { $val = $in{$key}; $in{$key} = &Jcode::convert(\$val, 'sjis'); } # データオープン open(DAT,"+< $datfile"); flock(DAT, 2); my @data; while (<DAT>) { push(@data,$_); if (eof) { last; } } # データ書き込み truncate(DAT, 0); seek(DAT, 0, 0); my $i=1 while (i<11){ my ($no,$name,$count) = split(/,/, $data[$i]); if($val eq $no){$count++;} if (eof) { last; } $i++; print DAT "$no,$name,$count,\n"; } close(DAT); ================= どうぞよろしくお願いします。

    • ベストアンサー
    • Perl
  • preg_matchのキャプチャ用サブパターンにマッチした文字列について

    お世話になります preg_matchのキャプチャ用サブパターンにマッチした文字列について 意図した動作が、試行錯誤しても全く得られませんので 分かる方にお教えいただきたく存じます 条件1 [*DATA: *]で囲まれたデータ(以下DATA)を取得 条件2 DATAにはoXoまたはoYoが順不同で、それぞれ1回または0回出現する $test = '[*DATA: A oYo B oXo C *]'; $reg = '/\[\*DATA:(.*?)(oXo|oYo)(.*?)(oXo|oYo)?(.*?)\*\]/u'; preg_match($reg,$test,$match); $matchの結果 $match[0] => [*DATA: A xYx B xXx C *] $match[1] => A $match[2] => oYo $match[3] => $match[4] => $match[5] => B oXo C 期待した結果 $match[0] => [*DATA: A oYo B oXo C *] $match[1] => A $match[2] => oYo $match[3] => B $match[4] => oXo $match[5] => C 1回または0回を表す「(oXo|oYo)?」が「0回」という条件が先に評価されてしまっているようなのですが「1回」を先にするすべはあるのでしょうか? 「(oXo|oYo)?」を「(oXo|oYo)」にすると期待した結果になりますが、条件2の「oXoが0回」「oYoが1回」出現した場合マッチしなくなります。 識者の方、お忙しい中恐縮ですがご教授いただけたらうれしいです。

    • ベストアンサー
    • PHP
  • Perlで空白行を削除

    現在、Perlにて外部のcsvファイルを読み込み、"重複行"と"空白行"を削除するプログラムを作成しています。 重複行を削除する部分は ------ open(IN, "csvtime.csv"); @data = <IN>; close(IN); @data = grep {!$count{$_}++} @data; open(OUT, "> csvtime.csv"); print(OUT @data); close(OUT); ------ でできたのですが、空白行を削除する部分がわかりません。 申し訳ないのですが、お教えいただけないでしょうか。 また、空白行で最初の空白行は残すようにしたいです。 よろしくお願いいたします。 例) 読み出しデータ ----- (ヘッダ1行目) (ヘッダ2行目) (ヘッダ3行目) (必要な空白) (ヘッダ4行目) 00:00:00,302 00:01:00,274 00:02:00,272 00:03:00,248 00:04:00,237 00:05:00,239 00:05:00,239 00:06:00,256 00:07:00,260 00:08:00,250 00:09:00,253 00:10:00,241 ----- 加工後データ ----- (ヘッダ1行目) (ヘッダ2行目) (ヘッダ3行目) (必要な空白) (ヘッダ4行目) 00:00:00,302 00:01:00,274 00:02:00,272 00:03:00,248 00:04:00,237 00:05:00,239 00:06:00,256 00:07:00,260 00:08:00,250 00:09:00,253 00:10:00,241 -----

    • ベストアンサー
    • Perl
  • dataファイルの特定の行から特定の行をダンプさせるには?

    $ cat data.txt #No1. abc... #No2. def... #No3. ghi... #No4. jkl... #No5. mno... なるデータの、例えば#No2.から#No4.までのデータだけをダンプするのに、 open(IN,"data.txt"); my $flag=0; while(<IN>){ if ( $_ =~ /#No2./ && $flag == 0) { $flag=1; } if ( $_ =~ /#No5./ && $flag == 1) { $flag=0; } print if $flag==1; } close(IN) と書いてみましたが、もっと簡単に書く方法を以前見たことがあったように思うのですが、こう書けばよいのでは?というアイディアがあれば、ご教授いただけないでしょうか?

    • ベストアンサー
    • Perl

専門家に質問してみよう