日本語プログラミング言語なでしこの公式掲示板

なでしこ の 掲示板

トップ 新規 検索

2023-02-20 14:03:15

Re①:メールファイル(msg)からテキストを抽出してエクセルへ転記(データベース)したい

雪乃☆雫 さん

 皆目見当が付かなくなってしまうのは、全部いっぺんに考えようとしてしまうからではないでしょうか。
 問題はいっこいっこ分けて検討し、解決していかなければ☆

 まず、最終的にはエクセルファイルにデータを追記していきたいわけなので、それが出来そうな命令を命令一覧で調べると、「エクセルセル設定」の他に「エクセル一括設定」とゆう、指定したセルへ二次元配列をまるっと一括設定出来る命令があるコトが分かります。
 それで、メールの内容を「1,解析」して必要な部分を抽出し、それを「2,スペースの削除等の整形」して追記したい形の「3,二次元配列を作成」して「4,エクセル一括設定」すれば良い、ということになります。

1,色々方法はあると思いますが、一番簡単なのはメールの内容を反復して、一行ずつ見ていくことだと思います。
 メールの内容が掲載のサンプルの通りなら、一文字目だけ見ていけば、その行が大項目か項目か、抽出したい内容かが分かるはずですね。
 文字列の一文字目は、「文字抜き出す」や「文字左部分」の命令で取得出来ます。

 「もし」文や「条件分岐」などで、それが「■」なら大項目、「◇」なら項目と判断出来ます。それ以外なら抽出したい内容ってコトになると思います。
 大項目は読み飛ばすとゆうことなので、何もしなくてよいですが、項目は、以降の抽出内容がどの項目に属するのか知る必要があるので、変数に代入するとかして記憶しておく必要があるでしょう。

 こうゆう処理の場合、もし文より条件分岐の方がすっきり書けるので、条件分岐での例。
#-------------------------------------------------
メールサンプルを反復
  対象の1文字左部分で条件分岐
    「■」ならば、//大項目。
      # 何もせず続ける。
    「◇」ならば、//項目。
      # 処理中の項目を記憶しておく。
    違えば、//抽出したいテキスト
      # 空白削除などの整形をする。。
#-------------------------------------------------

2,文字列中の特定の文字を削除するなら、空に置換してしまうのがカンタンです。
 空白なら、全角スペース、半角スペースなどをそれぞれ空に置換すれば良いということになりますが、正規表現を使っていっぺんにやる方法を発表しておきます。
 『文字列Sの「[\s| ]」を空に正規表現置換。』
 \sはスペースにヒットします。でもこれでは全角スペースがヒットしないみたいだったので、全角スペースも指定しています。

 そして、改行がよく分かんないですが、改行を全て削除して「あああかかかさささ」にするとゆう意味ですか? それとも改行だけの行は無視するとゆうことでしょうか。
 どっちにしても、抽出してエクセルに転記したい部分は複数行にわたる場合があるので、一行ずつ読んでいっているので、次の◇が発生するまで変数に追加していって、ひとつにまとめる必要があります。
前者なら「追加」していくだけでできます☆ 後者なら「一行追加」で出来ますが、空の行では何もしないことにする必要があります。

 こうなりますね(改行を全て削除した場合)
#-------------------------------------------------
    違えば、//抽出したいテキスト
      # 空白を削除して、抽出データに追加する。
      対象の「[\s| ]」を空に正規表現置換。
      抽出データにそれを追加。
#-------------------------------------------------


3,エクセルに転記出来る形を作るに当たって重要なのが、メールの項目は全部エクセルに存在して、何列目にあるのか分かってるものなんでしょうか?
 たとえば、名前、住所、電話番号...みたいな決まった項目があって、それがメールで送られてくるってコトでよいのでしょうか?
 もし、新しい項目がメールで送られてきて、エクセル側にも項目を追加していかなきゃとかゆうことだと、まあまあ大変だと思います。(その場合、大項目だって無視出来ないですよね)
 そうでないと仮定するなら、項目と列の対応表を作っておいて(C列に追加していくので、項目11なら0、項目21なら5となります)1で◇が出た時に、項目から列を取得しておきます。
 そして、次の◇が出た時に、2で作成した抽出内容の変数を、列にセットしていけばいいだけですね。

 で、こんな感じ?
#-------------------------------------------------
メールサンプル=『
■大項目1
◇項目11
 あああ
 かかか
 さささ

◇項目12
 いいい


■大項目2
◇項目21
 01-2345-6789

◇ 

項目列数変換表=「◇項目11,◇項目12,◇項目21」を「,」で区切る。
行=0。列=0。抽出データ=空。エクセル転記データ=空。
メールサンプルを反復
  対象の1文字左部分で条件分岐
    「■」ならば、//大項目。
      続ける。# 何もせず続ける。
    「◇」ならば、//項目。
      項目=対象。
      もし、項目が空でなければ、# 抽出したデータをエクセル転記用の二次元配列に挿入して抽出データを空に戻す。
        エクセル転記データ¥行,列=抽出データ。
        抽出データ=空。
      列=項目列数変換表の0から項目を配列検索。# 以降の抽出データの列数。
    違えば、//抽出したいテキスト
      # 空白を削除して、抽出データに追加する。
      対象の「[\s| ]」を空に正規表現置換。
      抽出データにそれを追加。
エクセル転記データを言う。
#-------------------------------------------------

4,エクセルにはC列の最下行に追加したいとゆうことなので、『「C」のエクセル最下行取得』で取得します。
まさにそうゆう命令なんですけど、これは今内容が入ってる最下行なので、+1したものが目的の挿入する行ということになります。

「・母艦とエクセル(データベース.xlsx)は同じフォルダ」というのは、どうゆう意図のアレですか?
エクセル開くで、ファイルのパスを指定しないでなんとかならんかという質問なのでしょうか?
「母艦パス」で、実行したプログラムのパスを取得することが出来ます。

「・電話番号の様に頭が0から始まる数字は文字列としたい」
メールサンプルのような「-」が入っている電話番号なら、文字列と認識されるので0は消えません。
「-」の入ってない電話番号で0が消えてしまうというお悩みなら、これはなでしこのことではなく、おそらくエクセル側でその列のセルの書式設定を文字列とかにしておくことじゃないでしょうか。

#-------------------------------------------------
オフでエクセル起動。# 不可視で起動。
「{母艦パス}てすと.xls」のエクセル開く。
挿入行=「C」のエクセル最下行取得+1。
「C{挿入行}」へエクセル転記データをエクセル一括設定。
「{母艦パス}てすと.xls」へエクセル保存。# 保存忘れず!w
エクセル終了。# 忘れず終了(特に不可視の場合)
#-------------------------------------------------

(編集パスワード送信)

子記事

親記事 (No.1603)
返信した記事(元) (No.1603)

この内容(No.1604)に返信

この内容(No.1604)をダウンロード

この内容(No.1604)のテキスト表示





www.eznavi.net