毎年の「○○○年度結果」を書く時、以下のような処理をしています。

  1. 自リーグのリーグ成績をテキストエディタにコピペ。たるい
  2. その後ろに総当たり差分判定機の結果を抜き出して追加。120行から6チームを探す! 一番めんどくせ
  3. 全角空白を半角空白に置換、半角空白2個以上を半角空白に置換、半角空白をタブ2個に置換。マクロ使えよ
  4. 予め書式を整えてテーブルタグを配置してあるExcelファイルのセルに上記を貼り付け。Excel立ち上げるのがうざい
  5. 上記を再びテキストエディタに貼り付け、タブを削除。日が暮れた
  6. これを網走と職員sの2リーグ分やる。命尽きる

とうとう面倒袋の緒が切れたので、作ってみました。

これを作った労力は「○○○年度結果」を半年もやれば取り戻せるはず。すげー単純な処理しかしていないので、予想外のテキストを入力するとどうなるか試してません。オラ知らね。それでも使いたい人は使ってみてください。

  10 コメント

  1. 早速使ってみました! すげえおもしろいです。
    で、とりあえず、名前にスペースがある人(大体4文字以内の人)と
    スペースがない人で、タブがずれるようです。
    あと外人のアスタリスクも悪さをしそう。

  2. おお、まさに予想外のテキスト。でもあれですね、これ通れば選手名鑑作成みたいな使い方もできますね。
    名前の入ってそうな位置までの空白を無視すればできるはずなので、数日中に対応してみます。処理が面倒くさかったらヘッダで見分けるようにするかも。アスタリスクも覚えておきます。

  3. チーム成績の出力に対応しました。コード8割くらい書き直しました(笑)。以下の要領でチーム成績を少し編集し、1行目にチーム名、2行目からヘッダと成績を入れてください。
    チーム名
    野手ヘッダ
    野手成績…

    投手ヘッダ
    投手成績…

    改行はあってもなくてもOK。アスタリスクは…面倒だから消しちゃった。内部的には以下のように処理しています。
    1行目のテキストに空白系文字の区切りがない場合、全体のヘッダ扱いとします。セルを横に繋げた感じのアレ。それっぽい文字列がなければこの処理は行いません。
    1 行目を含む全行について、ヘッダかデータ(成績の行)か判定します。ヘッダっぽいのがあれば、そこから新規のテーブル作成に入ります。さらに、ヘッダが野手成績か投手成績かリーグ成績かを見分けて、それぞれに合わせた処理をします。以下、新たなヘッダが見つかるか、テキストが終わるまでが1つのテーブルになります。
    ヘッダでもデータでもない文字列は、改行なら無視。他は全部データ扱いになります。なので、事前にチーム保有ポイントや故障者の行は除いておかないと、後からタグを削除しなきゃならないので面倒です。故障者の行は故障者の横に故障を表示するのに使えるから、いつか実装されるかも。ていうかあれですね、こんなにやるなら、リーグ成績用、チーム成績用って分けるべきですね。その方が改良しやすいし。
    以下余談。
    今までPerlはEUCで書いていたのですが、今回のこれはコードをUTF-8、入出力はShift-JISで書いてます。やってみたくて、そのテストのつもりでした。だからあんまりのめりこむつもりはなかったのですが、要望があるとやっちゃいますね。そしたら、文字数と桁数が超面倒でやんの。
    RBO のテキストは1行の中でデータのある桁が何桁目から何桁目か決まっています。EUC-JPの場合はn桁=nバイトだから、選手名の場所を切り出して隔離→ 残りの文字列の空白をタグに変換→選手名と連結で超簡単。空白で区切られていないデータがあったとしても(例えば、??_TeamdataBas.txt の性別国籍年齢のとこ)、桁数の決め打ちで区切れます。なので今まではそうしてきました。
    だけど、UTF-8だと全角も半角も英字も全部 1文字という扱いで、サイズは1バイト〜3バイト。全角1文字=半角2文字=2桁=2バイトの法則が乱れた! だから選手名の文字列が何桁目(何文字目)まで続くか、そのつど違うから決め打ちできない。空白で区切られてないデータは、文字列の何文字目にあるかがそのつど違うから以下略。うまい方法が見つからなかったので、いったんEUC-JPに変換→上記の処理→UTF-8に戻す、という頭の悪い方法をとっています。なんかいい方法ないのかな?

  4. さっそく使わせていただきました。PC語がわからない自分にはありがたいです。
    ただ、総当たりまでは出ませんでしたが・・・。
    あと、勝手ながらリンクにくわえさせていただきました。

  5. 作り直しCHU! やる気が萎まないうちにフンヌラバ

  6. #つ UTF-8を使わない
    # 自分もUTF-8は使ったことないので分かりませんが。
    # 要は桁数・バイト数に頼らない方法です。
    # 年齢から登録名までのフィールド数は常に固定ですよね。
    # @field = split(/\s+/); した時に $field[$n]が年齢であるならば
    # @field[$n..$n+20]がそれに該当します(野手の場合)。
    # で、$n がいくつになるのかがフルネーム次第で確定しないのが
    # 問題なんですよね。
    # ならば逆転の発想です。
    @field = reverse split(/\s+/); # これで @field[0..20]に
    # 登録名から年齢までが逆順に入ります。
    # あとは$field[21]以降のデータの様子を見て振り分けます。
    if($field[21] eq ‘*’) {
    # 外国人 なにもしなくてよし
    }
    elsif($field[21] =~ /^\*(.+)/) {
    # 名前と*がくっつているので分ける
    splice(@field, 21, 1, (‘*’, $1));
    }
    else {
    # 日本人
    splice(@field, 21, 0, (‘ ‘)); # * の代わりに空白をセット
    }
    # $field[21]が国籍と決まったので、残りはすべて名前部分
    $name = join(‘ ‘, reverse @field[22..$#field]);
    # 最後にフィールドを再度ひっくり返して、頭に名前をつける
    $answer = ” . $name . ” . join(”, reverse @field[0..21]) . “\n”;
    # 全角スペースが\sにマッチするようならもうちょっと複雑です。
    # これについては、あれば次回。

  7. # 最後の $answer の行は
    $answer = ‘<td>’ . $name . ‘</td><td>’ . join(‘</td><td>’, reverse @field[0..21]) . “</td>\n”;
    です。。。

  8. ここに反応してくれる人はまつうらさん以外いねーよなーって思ってました。先生ありがとうございます。
    >全角スペースが\sにマッチするようならもうちょっと複雑です。
    マッチします!
    とりあえず試してみます。

  9. # やっぱりマッチしましたか。では。
    # $field[21] をチェックする if ~ elsif ~ else まではそのままです。
    # $name の切り出しには length を使います。
    $len_whole = length($_); # まず全体の長さ
    # データのうち、打率からNOI もしくは 防御率からDIPS までは、
    # 半角数字と半角空白とピリオドとハイフンしか使われていません。
    # m/[\d .-]+/; # なわけです。
    # ということは、バイト数と文字幅、そして文字数も一致してますよね?
    # 測ってみたら、野手で79、投手で90でした。これを使います。
    # そしてバイト数と文字幅が一致しないところは length に任せるわけです。
    # で、まず投手から。
    $len_regname = length($field[0]); # 登録名の長さ
    $name = substr($_, 0, $len_whole-$len_regname-90);
    # これで頭から投法の終わりの桁までが取得できます。
    $name =~ s/\s*(?:\*\s*)?\d\d\s+[RL][ su]\s*$//;
    # 名前の後の空白、あれば国籍文字とその後ろに続く空白、
    # 年齢と空白、投法と空白、これらを削除します。
    # これで最初の2ケタと名前だけが残ります。
    # 野手の場合も方法は同じです。間に守備と肩という厄介な部分が
    # 入っていますが、上の方法を見れば、もう、お分かりですね。
    $len_field = length($field[18]); # 守備の長さ
    $len_shldr = length($field[17]); # 肩の長さ
    # あとは同じです。守備と肩の直前にある半角空白もカウントするのを忘れずに。
    $name = substr($_, 0, $len_whole-$len_regname-79-$len_shldr-1-$len_field-1);
    $name =~ s/\s*(?:\*\s*)?\d\d\s+[RLB][PS]\s*$//;
    # こんなもんでどうでしょうか。

  10. ありがとうございます。ここまでやってくれちゃったら、今やらざるを得ないですね。夜が明けるまでに、ちょっとやってきます。
    #ついてると、コメントとして読むときは読みづらいですが、コードを流用させてもらうときはすげー便利です。助かります。

 返信する

以下のHTML タグと属性が利用できます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

   
© 2012 キョカラソドットコムホームページ Suffusion theme by Sayontan Sinha