過去の桐井戸端BBS (桐ver.8)
12441 メールをテキストファイルに保存したものを桐の表に移したい 今村 誠 2001/07/27-09:39
皆さんこんにちは、メールをテキストファイルに保存して
行を列に変えて:セミコロンまでを項目名に
その後を項目値にしたいのですが、転置集計ではと思うのですが、
グループ項目などありませんので???の状態です。
以下はサンプルですが、行はあったりなかったりします。

item_10: 5
item_11: 00
from_name: yamada 太郎
from_kana: ヤマダ タロウ
from_zip1: 111
from_zip2: 1111
from_add1: 秋田県
from_add2: 秋田市
from_tel: 999
from_fax: 9999
支払方法: ヤマトコレクトサービス
to_name: やあだ
to_kana: あああ

文字位置関数でfrom_name:
のようにセミコロンまでを[明細]という項目名の項目値に
セミコロン以下の yamada 太郎
を[data]という項目名の項目値にしています。
最終的には、すべての項目名の入った表に読み込みしたいと思っています。
イベントでする予定です、桐8sp6です。

12444 Re:項目値を項目名にするには 【多遊】 2001/07/27-21:26
記事番号12441へのコメント
今村さんこんばんは。
>行を列に変えて:セミコロンまでを項目名にその後を
>項目値にしたいのですが、転置集計ではと思うのですが、
>グループ項目などありませんので???の状態です。

なかなかおもしろそうなので、おつき合いいたします。

ところで、最終的には
>[item_10][item_11][from_name]・・・・・・
>   5    00  yamada太郎・・・・・・
このような答えを求められてるのですか?

たしか、転置集計では・・『集計』ですので、文字列を転置処理はできないですね。
※グループ名はてきとうに付ければ項目名までは取得することは可能です。


また、
>イベントでする予定です、
とのことですが、
データの構造がもう少しわかれば別の答えもあると思います

たとえば1メール1ファイルとか、区切りのある複数メールとか
他にも

>item_10: 5
>item_11: 00
>from_name: yamada 太郎
は、本当は
>item_10: 5,item_11: 00,from_name: yamada 太郎,
この様になってるとか。

とにかく、テキストまで落ちてたら、いけるような感じです

12446 Re:項目値を項目名にするには 【多遊】 2001/07/27-21:49
記事番号12444へのコメント
少し強引かもしれませんが

とりあえず項目名の取得は、転置集計で、
転置項目で、項目名(R)をデータ項目名を指定して
その右側の詳細(O)から指定を『区切り文字』を選択
そして、区切り文字は:を入力これで集計を行います

ただ、この方法だと項目名の後ろに・・・が付加されますので
またこの削除処理が必要となります。

他には、作業項目を新たに作成し(データ項目は[元データ]とします)

[左側]項目計算式→#部分列([元データ],1,#文字位置([元データ],":")-1)
[右側]項目計算式→#部分列([元データ],#文字位置([元データ],":")+2)

このように分けて作業する方法が簡単でしょうね。


12447 Re:項目値を項目名にするには 今村 誠 2001/07/27-22:49
記事番号12446へのコメント
【多遊】さんこんにちは
>[左側]項目計算式→#部分列([元データ],1,#文字位置([元データ],":")-1)
>[右側]項目計算式→#部分列([元データ],#文字位置([元データ],":")+2)
>
>このように分けて作業する方法が簡単でしょうね。

ここまでは出来ています。
#cond([明細]=" Subject:",#直前値([枝番],0)+1,1,#直前値([枝番],1))
#SSTR([受信],1,#文字位置([受信],":"))
#SSTR([受信],#文字位置([受信],":")+2)

連続読込で取り込むか、1メールごとに取り込むかでも悩んでいます。
使用メールはEDMAXv2.84.2Fフリー版です。

メールにはマクロがあるのですが、振り替え(移動)とテキストファイル名を
日付(20010727.txt)で作成できないか検討しているところです。

1メールごとに項目名と一緒の行を検索して、項目値訂正を繰り返したが良いのではないかと思っています。
すべての項目が存在すれば、「読込み」でうまくいくと思いますが、
併合などでも項目が不定のためうまくいかないのではないかと悩んでいます。


12449 正論は予め表を作っておく方法です 佐田 守弘 2001/07/28-03:36
記事番号12441へのコメント
今村 誠さん
状況が今一つ分かってない所があるので外しているかも知れませんが、この種の課題についての私の考え方を述べます。
対象データはメールデータとの事で、データの先頭部分のタグを使って該当する項目にデータを記録したいのだと解釈します。

●データを記録する表の設計
この種のデータであれば、メールデータに限らないのですが、
該当する項目データがない場合があっても、予測されない項目が出て来る事はあり得ないと考えます。
つまり、データを記録する表の項目は予め全てを網羅する形で作っておく事ができるはずです。
書かれている例で言えば、[item_10]〜[to_kana]の様な項目を全て持った表を作っておくわけです。

●テキストデータの読み込み方
次にテキストデータの読み込み方ですが、2つの方法があります。
(1)ファイル入力コマンドで1行ずつ読み込む方法
テキストデータから1行ずつ読み込みながら、項目の振り分け処理をして行きます。
振り分けでは、各行のコロンの位置を調べ、その位置で前後を分割して、タグとデータに分けます。

(2)読み込み用のワーク表に読み込んでしまう方法
[テキスト][タグ][データ]の3項目からなるワーク表を作っておき
[テキスト]の項目にテキストデータを読みます。[タグ]と[データ]の項目には計算式を設定しておき、
コロンの位置で分けた前後の文字列を自動的に求めます。

2つの方法を比較した場合、おそらく(2)の方法が簡単で分かりやすいと思います。
以下はこの方法で説明します。

●テキストから分離したデータを表に書き込む
元のテキストデータには、先頭か末尾に必ず存在する項目があるはずだと思います。
まずこれを判定して下さい。
要するに、1レコード文の区切りを判定するデータとしてどれを使うかです。
あるいは1レコード分の間に単なる改行レコードがあれば、それを判定しても構いません。
もし空の行をワーク表に読み込めば、未定義値のレコードができるはずです。
仮に先頭が判定できるのであれば、それを判定して行追加をします。
次いで、[タグ]の値を読みながら、どの項目に書き込むかを判断し、[データ]の項目の値を記録する表の該当する項目に書き込みます。

この様に、テキストの1行分を読んでは、どの項目に書き込むかを判断しながら
順次処理して行く繰り返しを行えば、目的が達成されるはずです。

なお、私が以前に執筆した「入門桐ver.5一括処理編」にも、類似の処理の一括処理を掲載した事があります。

佐田守弘(KS-00119)
12451 Re:項目値を項目名にするには 【多遊】 2001/07/28-08:08
記事番号12447へのコメント
以前beckyからメールデータを読み込むときに利用したルーチンですが紹介します。

事前に、データ部分を取得する項目と計算式が設定してあると想定します。
また、全項目数の変数も設定を行ってください。

繰り返し (.not #終端行)

  Subject等のヘッダー処理

繰り返し ([受信]<>"") ・・・beckyの場合の1メールの区切り
  条件(#先頭一致([受信],"item_10:",3)) &item_10=[データ]
  条件(#先頭一致([受信],"item_11:",3)) &item_11=[データ]
  条件(#先頭一致([受信],"from_name:",3)) &from_name=[データ]
   −−−−以下項目数(全変数)分続きます−−−−
  ジャンプ 行番号=次行
繰り返し終了

  保存表へ書き込み処理。行追加・行訂正等で
  [item_10]=item_10,[item_11]=&item_11,[from_name]=&from_name
  項目へ変数から代入

繰り返し終了

※処理自体は、簡単なので、すぐおわかりになると思いますが
私が一番悩んだのは過去に取り込んだデータとの重複です

>連続読込で取り込むか、1メールごとに取り込むかでも悩んでいます。
beckyからの読み込みを行うとき、becky自体はなにも操作を行いません
従って、メールの削除を行わない限り何度でも読み込みます。
仮に作業表と保存表として説明いたします。
作業表だけでは、重複チェックはできません。保存表を参照したいのですが
メール自体に記載されてる時間は100%正しいとは限りません。
また、メールもサーバーの関係か、前後してくることもあります。
かといって、Subjectでも重複チェックもできませんでした。
結局、時間もSubjectでもできず、特別に時間+Subject+メールアドレスの項目を付け行いました。

どこかに、新着(未読)をチェックする項目もいれておかれた方がいいでしょうね


12452 Re:項目値を項目名にするには 今村 誠 2001/07/28-13:34
記事番号12451へのコメント
【多遊】さんこんにちは、一括作っていて遅くなりました。
>beckyからの読み込みを行うとき、becky自体はなにも操作を行いません
>従って、メールの削除を行わない限り何度でも読み込みます。

テクストファイルで保存したら、メールを削除か移動しようと思っています。
そのために、メールソフトのマクロでテキスト保存と削除できるのを探しています。

>結局、時間もSubjectでもできず、特別に時間+Subject+メールアドレスの
>項目を付け行いました。
>どこかに、新着(未読)をチェックする項目もいれておかれた方がいいでしょうね

受信日時分の日時項目をもうけてチェックできるようにしようと思っています。

佐田先生の完成表の項目名と【多遊】さんの繰り返しを使って読み込みました。

  代入 &編集1="mail.tbl",&EOF=1,&編集2=#CAT(#一括パス名,"mail中継.tbl")
  表 &編集2,終了状態=&処理
  行削除 *,圧縮,終了状態=&処理
  call 項目索引()
  表 &編集1,終了状態=&処理
  行削除 *,圧縮,終了状態=&処理
  繰り返し
    &FILE名=#ファイル検索(#CAT(&sub3wfm,"*.txt"),&EOF),&処理=1
    編集表 &編集1
    行削除 *,終了状態=&処理
    条件(&FILE名="") 繰り返し中止  /*←ここ!*/
    条件 (#FSIZE(&FILE名)>1) \
 読み込み テキスト,&FILE名,空白削除=しない,項目名=する,終了状態=&処理,{[受信]}
   繰り返し &実行リターン=1,21,1
    &STR=#対応文字列(&項目名,&実行リターン)
検索 [明細]{&STR},文字比較方法=自動,部分一致検索=しない,終了状態=&処理
     条件(&処理=1) &検索3=[data]
     条件(&実行リターン=1) 編集表 &編集2
     条件(&実行リターン=1) 行追加 終了状態=&合計
     条件(&実行リターン=1) ジャンプ 行番号=前行
     条件(&処理=1 .not &実行リターン=1) 編集表 &編集2
     条件(&処理=1) 行訂正 終了状態=&合計値,&STR=&検索3
     編集表 &編集1
   繰り返し終了
    &EOF=&EOF+1         /*←ここ!*/
  繰り返し終了
    &FILE名=#CAT(&sub3wfm,"*.txt"),&編集3=#CAT(#一括パス名,&編集3,"\")
    ファイル複写 &FILE名,&編集3,終了状態=&処理
12453 ありがとうございました 今村 誠 2001/07/28-13:52
記事番号12449へのコメント
>対象データはメールデータとの事で、データの先頭部分のタグを使って
>該当する項目にデータを記録したいのだと解釈します。
最大で21項目あります。

>●データを記録する表の設計
>この種のデータであれば、メールデータに限らないのですが、
>該当する項目データがない場合があっても、予測されない項目が
>出て来る事はあり得ないと考えます。つまり、データを記録する
>表の項目は予め全てを網羅する形で作っておく事ができるはずです。
>書かれている例で言えば、[item_10]〜[to_kana]の様な項目を全て
>持った表を作っておくわけです。

>(2)読み込み用のワーク表に読み込んでしまう方法
>[テキスト][タグ][データ]の3項目からなるワーク表を作っておき
>[テキスト]の項目にテキストデータを読みます。[タグ]と[データ]
>の項目には計算式を設定しておき、コロンの位置で分けた前後の文字列
>を自動的に求めます。

この方法を採用しました。

>●テキストから分離したデータを表に書き込む

先頭に必ず存在する項目で、1レコード文の区切りを判定するデータとして使いました。

>仮に先頭が判定できるのであれば、それを判定して行追加をします。
>次いで、[タグ]の値を読みながら、どの項目に書き込むかを判断し、
>[データ]の項目の値を記録する表の該当する項目に書き込みます。

>この様に、テキストの1行分を読んでは、どの項目に書き込むかを
>判断しながら順次処理して行く繰り返しを行えば、目的が達成される
>はずです。

>なお、私が以前に執筆した「入門桐ver.5一括処理編」にも、類似の処理
>の一括処理を掲載した事があります。

先生のご本を探しましたが、整理整頓が悪いため見つかりませんでした。
それでこの質問となった次第です。(^0^)
【多遊】さんのお返事にも書きましたが、無事桐の処理は完成しました。
マクロの使用できるメールソフトでメール→テキストに変換して、
ファイル名を日付で付加してくれるソフトを探しています。

戻る