• 締切済み

perlによるフールド分割の仕方

1レコード上のフィールドを分割したいのですが、効率が悪く困っております。 良い方法があれば、ご教示お願いいたします。 ex) 100Byteのレコード上、5カラム目から3Byteのフィールドを取り出したい場合。 $filed1 = substr($buf,4,3); でできれば楽なのですが、不規則に漢字コードが入っているため、開始位置や取り出す長さが変わってしまいます。 そこで、下記のようにしたのですが… #------------------------------ open(IFILE, "<$in"); while (read IFILE, $buf, 100) { @str = split //, $buf; $filed1 = join('', @str[4],@str[5],@str[6]); : 処理 : } close (IFILE); #------------------------------- フィールド長が長い場合、大変効率が悪いのです。 perlにあまり慣れていないので、簡単に記述できる例がありましたら、お教え頂けますでしょうか。 よろしくお願いいたします。

みんなの回答

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.2

[4-6]ではなく[4..6]です。 で、対して変わらないでしょうがこんな書き方↓も可能です。 $filed1 = join('',(split(//,$buf))[4..6]);

trafic
質問者

お礼

ご回答ありがとうございます。 おかげさまで、無事、結合ができました。 やはり、一度、すべてのバイト単位でばらさなくては、ならないですが、この形を利用し、解決したいと思います。 ありがとうございました。

  • Dpop
  • ベストアンサー率51% (279/544)
回答No.1

うぅ~ん。 下の処理を採用している意味合いが良く見えませんが。。。 > $filed1 = join('', @str[4],@str[5],@str[6]); の部分は、 $filed1 = join('', $str[4-6]); の様に範囲指定でも書けます。 でも、これでは substr とやっている事は変わらない様な。(しかも、効率悪い。) 不特定な位置に漢字が入っているなら、1バイト目から漢字を識別しながら必要な項目を取得した方が無難な様な気がします。

trafic
質問者

お礼

ご回答ありがとうございます。 何故か私の環境では、  $filed1 = join('', $str[4-6]); では、連結できません。  $filed1 = join('', @str[4],@str[5],@str[6]); ならば、できるのですが... 実は、1レコードが1000Byteを超える上、取り出したいフィールドも数十Byteをもあるため、  @str = split //, $buf; の様な非効率な指定を避けたいのですが、無理なのでしょうか。 $str[4-6] だけでも成功すれば、だいぶ助かるのですが。

関連するQ&A