文字列処理

【難易度】☆☆

 ひまわりの文字列処理機能は強力です。テキストの整形、形式変換が、簡単に出来ます。なぜ、文字列処理が充実しているのかといえば、作者が仕事でよく使うからです。ここでは、形式変換のためのテクニックを、皆様に伝授したいと思います。


初めにファイル入出力

 仕事をこなす上で重要なのが、ファイルの読み書きです。
 データを読み込んで、それに処理を施し、ファイルへ保存するというお決まりの作業です。
 ひまわりで、ファイルを読み書きするのは、非常に簡単です。
 この処理の雛型を書いてみると、以下のようになります。

 (ファイル名)を、開く。
 {★ここで、何か処理を施す★}
 (ファイル名)へ、保存。

 では、ファイルの内容にある全角文字を全て半角文字に変換するというプログラムを書いてみます。

  ’対象ファイルの内容を半角に変換するプログラム
  対象ファイルは、『c:\test.txt』
  対象ファイルを、開く。
  それを、半角変換。’半角に変換する
  対象ファイルへ、保存。

 実に簡単ですね。
 つぎに、HTMLファイルを読んで、HTMLタグだけを削除するプログラムを、書いてみましょう。

  ’HTML→普通のテキストへ変換するプログラム
  入力ファイルは、『c:\test.htm』
  出力ファイルは、『c:\output.txt』
  
  入力ファイルを、開く。
  それから、タグ削除。
  出力ファイルへ、保存。

 ポイントは、ファイル名を予めプログラムの先頭でまとめて書いているところです。
 一度作ったプログラムは、後になって、再び使う可能性があります。
 そこで、書換えがありそうな部分を、プログラムの先頭にまとめておいて、少しの変更を加えるだけで、再び使えるようにしておくと便利です。

文字の置き換え

 さて、上のHTMLタグを取り除くプログラムでも、ぜんぜん問題はないのですが、さらに凝った処理をさせてみましょう。
 テキストへ変換するときに、簡単なHTMLタグの意味解釈をさせるのです。
 例えば、HTMLの<BR>タグは、改行を表し、<H1>は、見出しを表しますので、それらを、意味のある文字に置き換えます。
  ’HTML→普通のテキストへ変換するプログラム
  入力ファイルは、『c:\test.htm』
  出力ファイルは、『c:\output.txt』
  
  入力ファイルを、開く。
  「<H1>」を、「■」に、置換。'H1タグを、■に、置換
  「<H2>」を、「□」に、置換。'H2タグを、□に、置換
  「<H3>」を、「○」に、置換。'H3タグを、○に、置換
  「<BR>」を、「\n」に、置換。'BRタグを、改行に置換
  「<BLOCKQUOTE>」を、「\t」に、置換。'タグを、タブに置換
  それから、タグ削除。
  出力ファイルへ、保存。
 日本語の分かりやすさのおかげで、特に、命令を説明する必要もないかと思いますが、「置換」命令は、特殊変数「それ」の内容に対し、Aを、Bに、置換して、「それ」に答えを返すという処理を行っています。

アンケートを集計する

 ひまわりのダウンロードページ(http://hima.chu.jp/download/download.htm)には、簡単なダウンロードアンケートが設置されています。
 私は、このアンケートを受け取るのが非常に楽しみで、このアンケートを設置してから、毎日のメールチェックが3倍楽しくなりました。
 このアンケートは、私が、個人的に読んでいるだけなのですが、ここで、一度、ひまわりを使って集計してみたいと思います。

■形式の説明
 アンケートは、ひまわりのホームページから、CGI(sendmail)でもって、Eメールで私のメールボックスへ一通ずつ届ききます。今回、メールを集計するために、メールを、1メール1ファイルの eml 形式で、保存しました。
eml ファイルを開くと、アンケートは、「項目名=その答え」のような形式になっています。例として、1つの eml ファイルを提示します。
名前=クジラ飛行机(←作者です)
最近の若者に一言=へらへらするな!
タイプ=インドア派
ネット環境=快適
住所=ア 愛知県
職業=その他
年齢=25
やってみたいこと=その他
プログラム=初心者
ダウンロード回数=はじめて
性別=男
好みの異性=才能がある
content=ひまわりアンケート
一言=頑張れ
マイブーム=漫画喫茶に通うこと

最近の若者に一言をピックアップする

 まずは、手始めに「最近の若者に一言」という項目をピックアップして表示させてみます。
 1メールが、1つのファイルになっているので、まず、フォルダの中の、拡張子が、「eml」のファイルを列挙します。
これは、
『*.eml』の, ファイル列挙。
と、書きます。
 「ファイル列挙」命令の引数は、任意のフォルダを指定するのですが、このようにワイルドカードを使って、特定のファイルだけを抜き出すことも出来ます。

 ファイルを列挙したら、次にそれぞれのファイルの内容を処理していきます。ファイル名は、特殊変数「それ」に、配列形式で得られますので、それぞれを処理するには、「反復」命令を使うと便利です。(→配列と反復子
『*.eml』の, ファイル列挙。
それを、反復(
  それを、開く。
  {アンケートの集計処理}
)。

 あとは、前項でみた通り、ファイルの内容を読んで、処理するだけです。 
*変数初期化
一言は、「」。
処理情報を、ラベルとして、作成。

*メイン処理
『*.eml』の, ファイル列挙。
それを, 反復('それ=ファイルのリスト
  処理情報は、それ。描画処理反映。
  それを、開く。'それ=ファイル名
  内容を調べる。
)

*集計結果の表示
一言を、表示。
待機。

*内容を調べる
それを、反復(
  調査行は、それ。
  情報ラベルは、それ。描画処理反映。
  調査行を,「=」で,区切る。
  もし、それ#0が、「最近の若者に一言」ならば(
    一言=一言&それ#1&「\n」
  )
)
戻る。
結果としては、
がんばれよ
しっかりしろ (自分もそうだ)
食べ放題
人間は嫌い☆
がむしゃらにやってみれ!
貴様らそんなに癒されたいか
世界は君だけのものではない!
・・・
などなど、なぜか、回答しているのが、若者ばかりだったのが不思議でしたが・・・。

平均年齢を調べる

 次に、平均年齢を集計しようと思います!
*変数初期化
年齢合計=0
人数=0
処理情報を、ラベルとして、作成。

*メイン処理
『*.eml』の, ファイル列挙。
それを, 反復('それ=ファイルのリスト
  処理情報は、それ。描画処理反映。
  それを、開く。'それ=ファイル名
  内容を調べる。
)

*集計結果の表示
「合計={年齢合計}才/人数={人数}」と,表示。
「平均={年齢合計/人数}才」と,表示。
待機。

*内容を調べる
それを、反復(
  調査行は、それ。
  情報ラベルは、それ。描画処理反映。
  調査行を,「=」で,区切る。
  もし、それ#0が、「年齢」ならば(
    人数=人数+1
    年齢合計=年齢合計+それ#1
  )
)
戻る。
気になる結果のほうですが、スゴイ!
  年齢の合計が、9664才!
  年齢の平均は、31.28才!
でした。

まとめ

 このように、ひまわりの文字列処理は、非常に使いやすく便利なものとなっています。
ここでは、触れませんでしたが、正規表現も、使えます。(→正規表現の使い方

基本的には、
   ■一気に文字を置き換えるのは、「置換」命令
   ■ちょっと複雑な処理をしたいときは、「反復」命令を使って一行ずつ処理する
   ■何か区切り記号があるときは、「区切る」命令を使って、処理しやすい形に切り出す
の、3つが使えると、これだけで、かなりの用途に耐えうると思います。

戻る