▲ゴト技top| 第11章 1| 2| 3| 4| 5| 6| 7| 8| 9| |
[第11章●そろそろ正規表現はいかがですか] 8… 実習1:同報リストを作成する |
[2004.02.16登録][2004.02.21更新] |
石田豊 |
では、「実習篇」であります。まずは「らくらくアドレス変わりました同報メール作成の巻」。 貴兄のメールアドレスが変わった、としましょう。シゴト上のつきあい、プライベートな友人、そうした知友のすべてにその通知のメールを出したい。 こういう際によく使われる方式は、メールのBcc欄にアドレスを列記して同報メールにする方法です。おおくのメールソフトでは "石田 豊" 幸いにも、知友の住所氏名の全てが登録されたエクセル書類があった、としましょう。それをテキストファイルにしたものが正規表現練習1だと思って下さい(別窓で開きます)。 この書類は「☆」区切りで、各行は[氏名][郵便番号][住所][メールアドレス][電話番号]という構造になっています。 このファイルから正規表現を使って、求める"石田 豊"<ishida@pot.co.jp>,"沢辺 均"<kin@pot.co.jp>,……という形式に変換してしまおう、というわけです。 まず正規表現練習1を開き、全てを選択して、コピー。エディタの新規書類にペーストします。続いて、「☆」をすべてtabに変換します。これでタブ区切りの文書になります。 この書類をよく観察して、どのように加工したらよいかの作戦を考えて下さい。独力でチャレンジしてみようと思われる方は、ここで、これ以降を読むのを中断して、取りかかってみて下さい。 さて、ターゲットの構造はタブ区切りです。タブで区切られた部分を項目と呼ぶことにすれば、欲しいのは第1項目、第4項目だけです。そしてそのふたつの項目を「"第1項目"<第4項目>」という形に加工しなければなりません。そしてその各行を「,」(コンマ)でつなげばいいのです。 ではどのような正規表現を書けばいいでしょう。各「項目」を指定する表現は [^\t]*\t で取り出すことができます。読み下すなら、タブ以外の文字の0文字以上の連続があって、タブが来る、という表現です。.*\tとやると、タブコード自体も「改行以外の任意の1文字」に該当してしまうため、最長一致で複数項目が一気に含まれてしまうことに注意して下さい。 1行5項目からなるこのデータの各行の各項目を切り分ける正規表現は、 ^[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t.*\n となるはずです(ただしK2Editorの場合。miの場合は最後が\r)。先頭の「^」はあってもなくても同じ。ま、この場合は気休めです。 この第1項目と第4項目を取り出すために、そのふたつの項目をグループ化します。 ^([^\t]*)\t[^\t]*\t[^\t]*\t([^\t]*)\t.*\n これでOK。た〜んじゅんでしょ。こ〜んなもんなんすよ。これを、どう置換するか。置換もまた単純です。 「"第1項目"<第4項目>」としたいのですから、ここに後方参照をあてはめればよいだけ。 "\1"<\2>, これはK2Editor式でしたよね。miの方は\が$になって、 "$1"<$2>, で、実際に試してみると、どうかな。miの方は若干(ほんの若干)時間がかかるんだけど、K2Editorの方は、ほぼ一瞬で置換終了。どちらにしても1分かからない。このデータ、実は728件あります。728件のデータの整形が1分。もし百歩譲って(なんで譲らなあかんかわかりませんが)2分かかるとしても1件あたり0.16秒ですからね。 ただ、K2Editorの方は、こういう置換を行ったら、即座に別名で保存をかけるのがいい。そうじゃないと、異常終了する場合があります。そうしたクセとかをちゃんとわかっておくためにも、平時にいろいろ試しておく必要があるんですね。 で、余談をよっつ。 ひとつめは、このサンプルのリスト。言わずもがなですが、まったくの架空の人物、住所、電話、アドレスです。とある団体の名簿をWebからパクってきて、姓名をバラバラ、地番をぐちゃぐちゃ、電話番号を順列組み合わせで加工したものです(もちろん、正規表現を使って)。くれぐれ、電話をかけたり、メールを出したりなさらないよう。 ふたつめ。メールソフトによっては(て、ゆーか、ほとんどのメールソフトでは)728件のアドレスをいっぺんにBcc欄にペーストすると、エラーが生じます。実際に行う場合は、いくつかに分割して送るように。 みっつ。この置換では、最終データの末尾に「,」がつきます。実際の運用時には、そのコンマを削除しておいたほうがいいでしょう。 最後。この検索が^([^\t]*)\t[^\t]*\t([^\t]*)\t[^\t]*\t.*\nであって^([^\t]+)\t[^\t]+\t([^\t]+)\t[^\t]+\t.+\nでないのはなぜでしょう。考えてみてください。また当然のことながら、個人の住所録にはメールアドレスが記載されていないレコードもあるはずです。空白のメールアドレスをBcc欄に書き込むと具合が悪そうです。そのためにはあらかじめ対策を施しておきます。それはどうやればいいでしょう。考えてみてください。 余談は以上。 格闘技のカリスマに横っ面を張られて喜ぶ人が多いのは、心底びっくり。人に殴られて喜ぶなよ、おかしいぜと強く思うのですが、ともあれ、そのカリスマは同時に「馬鹿になれ」というプロパガンダを展開もしております。 ふむなるほど、バカじゃなくっちゃ、人に殴られてヘラヘラ笑っちゃいられないだろう。ふたつはセットになっているわけね。このことからも、馬鹿になっちゃいかんなあ、と確信を新たにするわけであります。 バカであってはいけないのですが、しかし、現実社会にはお利口すぎることの弊害も、残念ながらたくさんあります。そのひとつがエクセルですね。表計算ソフトマイクロソフト・エクセルはお利口すぎて困ることが多い。 私は前に書いたように(注:現時点ではまだ書いていない)「餅は餅屋主義者」であります。場合場合によって、使用するアプリケーションをご都合主義で組み合わせて作業していこうという考え方。ですから、タブ区切りになった項目の並び順を変更する、なんて場合は、エクセルを使うってのがスジです。しかし、エクセルが賢すぎるため、なにかと弊害が起こる。 具体的にいうと、こういうケースです。 業務の一環としてながーい報告書を書いた、と。印刷の都合もあってワードで書いた、と。その中に「研究会参加者」という節があり、 南都加株式会社tab山田 太郎tab45-13 猿叉茸栽培協会tab大山 昇太tab32-11 というふうなリストが延々つづいている、と。「45-13」という項はなんだかよくわかりませんが、45勝13敗とでも思ってください。ま、ともあれ、こういうデータ。出来上がって上司に見せると、 山田 太郎(南都加株式会社)tab45-13 というふうに書き直せなんて暴虐無道なことを言いくさった、と。どうでもええやんけ、と毒づくのは心の中だけ。 しかし、これはタブ区切りになっていますから、何千行あろうとも、その部分をくるっとコピーし、エクセルの新規書類にペースト。列の並び順を変更すれば、上司の気まぐれな指令に完全準拠することが楽勝で可能です。可能なはずです。 しかし、エクセルは「賢すぎる」。45-13を計算式だと思って32という具合にかえちゃうんですね。もちろんあの手この手でその計算を抑制することはできます。しかし、面倒だ。 今回の「実習」のテクを使えば、こういう際にもわざわざ秀才エクセルくんにたよらなくてもOK。エディタ/正規表現でスコスコ実践できちゃう。 非常に使用頻度の高い正規表現テクなのです。 |
この記事は
|
お読みになっての印象を5段階評価のボタンを選び「投票」ボタンをクリックしてください。 |
投票の集計 |
投票[ 6 ]人、平均面白度[ 4.3 ] ※「投票」は24時間以内に反映されます※ |
Kさんより [2004.02.21] |
新しいことを覚えたと実感できる一日 はじめまして。都内でDTP会社につとめてるものです。といっても最近は中小企業のサイトを作るとかweb関係の事の担当になったものでいつも苦しんでます。 マック歴はほぼ10年にもなるのですが難しいことから目を背けていたためここに来てかなり限界を感じてperlやunixの勉強を始めたところです。googleから「そろそろ正規表現はいかがですか」を検索で見つけて読ませて頂き今日一日、試しながらじっくりと勉強させて頂きとても勉強になりました。 具体的にテストするためのテキストが用意されていたので無理なく進める事が出来ました最後の名簿は自力でチャレンジし、完全には出来ませんでしたが久しぶりに「新しいことを覚えた」と実感できる一日でした。 なかなか取っつきにくく使えたら便利なのはわかってた正規表現ですがやっとその入り口に立てました。 連載がまだ続くのでしたら是非とも読んでみたいと思っております。 本当にありがとうございました。 ____ Kさんのような方を念頭に置いてかいた記事ですから、そういう方のお役にたてたってことは、わたしにとって大きな喜びです。(石田) |
ご意見をお聞かせください |
|
←デジタル/シゴト/技術topへもどる | page top ↑ |
▲ゴト技top| 第11章 1| 2| 3| 4| 5| 6| 7| 8| 9| |
|ポット出版
|ず・ぼん全文記事|石田豊が使い倒すARENAメール術・補遺|ちんまん単語DB| |
|
|