質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.93%

出力されるテキストを扱いやすい形式に変換したい

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 668

yuki_90453

score 173

いつもお世話になっております。
メール受信時に内容を解析し、情報を取得したいと考えています。

メールはテキストメールでありHTML形式ではございません。
メールのテンプレートは下記のようになります。

(省略)
---------------------------------------------------------------------
[受注番号] 000000-20170205-0000000
[日時]     2017-02-05 00:00:00
[注文者]   名前 太郎 (ナマエ タロウ) 様
          〒123-0000 東京都
          (TEL) 090-0000-4444

[支払方法] クレジット
[ポイント利用] 1000
[配送方法] 郵便
[配送日時指定]


[備考]
●備考
---------------------------------------------------------------------
[ショップ名]   ***********
==========
[送付先]   名前 太郎 (ナマエ タロウ) 様
          〒123-0000 東京都
          (TEL) 090-0000-4444
[商品]
商品名(商品番号)
サイズ:XL
カラー:ブルー
※オプション:無し
価格  6,0000(円) x 1(個) = 6,0000(円)   (税込、送料込)
獲得ポイント660
*********************************************************************
小計     6,0000(円)
送料     0(円)  離島・一部地域では別途料金が必要な場合があります
---------------------------------------------------
合計     6,0000(円)
---------------------------------------------------------------------
今回のお買い物で獲得するポイント 660
---------------------------------------------------------------------
*消費税について
 消費税率      8%
 消費税計算順序   1商品毎に消費税計算
 1円未満消費税端数 切り捨て
---------------------------------------------------------------------
(省略)

受信したメールを出力するプログラムは下記になります。

# -*- encoding: utf-8 -*-
#-------------------------------------------------
# Ruby script to get a mail via alias of postfix.
#-------------------------------------------------
require 'mail'

class GetMail
  def trigger
    dt = Time.now.strftime("%Y%m%d_%H%M%S%L")
    @out_file = "/home/info/Document/#{dt}.txt"
    open(@out_file, "w+") do |f|
      mail = Mail.new($stdin.read)
      f.puts "From:    #{mail.from.first}"
      f.puts "To:      #{mail.to.first}"
      f.puts "Date:    #{mail.date}"
      f.puts "Subject: #{mail.subject}"
      f.puts "Body:\n#{mail.body}"
    end
  rescue => e
    $stderr.puts "[#{e.class}] #{e.message}"
    e.backtrace.each{|trace| $stderr.puts "\t#{trace}"}
    exit 1
  end
end

exit unless $0 == __FILE__
GetMail.new.trigger

この方法ではテキストファイルで出力されるのですが、必要な情報を取得するのに正規表現で取得しなければいけなく使いにくいです。
テキストファイル以外の扱いやすい形式で出力したいのですが、何かオススメはありませんか?

追記・備考

使用言語 Ruby
1件辺りのメールの容量は4KB程度です。
送信者側のフォーマットは決まっておりますので、受信者側で解析、変換したいと考えております。
メールはテキストでメールであり、HTMLメールではありません。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yuki_90453

    2017/02/06 15:56

    masaya_ohashi 様 情報を足らず申し訳ございません。「メールを受け取る側」が解析するための手法です。

    キャンセル

  • yuki_90453

    2017/02/06 15:59

    masaya_ohashi 様 送信者は私が管理していないので形式の変更が出来ません。受信者側でなんとかしたいと考えています。

    キャンセル

  • yuki_90453

    2017/02/06 15:59

    tomohiro_obara 様 情報不足ですみません、今から追記いたします。

    キャンセル

回答 4

checkベストアンサー

0

受信したメールを解析して、プログラム上扱いやすいフォーマットに変換する方法と理解しました。
また、その際の条件は記載の通りだとすると、特に限定される問題はなさそうです。
Rubyで扱うというのであれば、csvでもjsonでもxmlなど、ライブラリ等で簡単に扱えるフォーマットをご自由に選択すれば良いと思います。
内部的に扱うだけでしょうから、validateも不要でしょうし。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/06 18:08

    回答ありがとうございます。

    私が意図しているのは、上記のテキストから[受注番号]や[商品名]などの情報を取得しやすいように変換したいと考えております。テキストファイルで出力した場合、取得したい情報を得るのに正規表現が必要かと思いますが、私は正規表現が苦手なので正規表現を使いたくないと考えております。

    理想としては、HTMLやXMLのようなマークアップ言語で[受注番号]や[商品名]などをタグで囲み、セレクターで内容を取得が出来ればと考えているのですが、出力方法をXMLに指定しても自動でマークアップされません。
    出力する時に、マークアップする文字列を指定しなければいけないと思います。その際に正規表現を使うのであれば、テキスト形式で出力するのとやっている事は同じです。

    >受信したメールを解析して、プログラム上扱いやすいフォーマットに変換する方法と理解しました。
    もちろんプログラム上で扱うので間違ってはいないのですが、取得したい情報(例えば商品名)を正規表現を使わず、かんたんな方法で取得出来る方法を探しています。

    キャンセル

  • 2017/02/06 18:26

    再投稿させて頂きました。
    https://teratail.com/questions/64810?modal=q-comp

    キャンセル

  • 2017/02/06 18:29

    であれば、質問は以下のようになるのではないでしょうか?
    ・フォーマットが固定されているテキストファイル(文字列)から、正規表現などを利用せずに、より簡単にパースしたい

    そして、その一つの解が、masaya_ohashiさんが提示されているscanfです。

    キャンセル

0

1. scanfを使ってメールからデータを引き抜く
http://takuya-1st.hatenablog.jp/entry/20110930/1317401014
2. 引き抜いたデータをHashにまとめる

data = {
    :id => "000000-20170205-0000000",
    :date => "2017-02-05 00:00:00",
    #以下略
}


3. jsonモジュールを使ってJSON文字列に変換して保存

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/06 18:28

    回答頂きありがとうございます。scanfというのを始めて知りました。
    %記法を始めて使うのでドキュメントを見ながらやってみます。

    キャンセル

  • 2017/02/06 18:37

    正規表現よりはまあわかりやすいかなと思います。

    キャンセル

0

XMLか、YAMLが良いんじゃないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/06 18:10

    回答ありがとうございます。
    上記のテキストをXMLで出力した場合、 <name>や<mailadress>などといった風に自動でマークアップされません。(やっていませんがYAMLで出力した場合も同じではないかと考えています)
    出力する際に、どのようにマークアップするか指定しないといけないと思いますが、その際に正規表現を使うのであればテキスト形式で出力するのとやっている事は同じではないかと思います。

    キャンセル

  • 2017/02/06 18:14

    もしかして、「適当に指定すれば、自分でテキストを解釈せず、自動的にうまくやってくれる」とか思っていますか?
    それはAI搭載言語でもないと無理です。

    自分でテキストを解釈した上で、そのデータをどの形式で保存するのがいいかという質問だと思って回答しました。

    キャンセル

  • 2017/02/06 18:27

    もちろん思っていません、私の質問が回りくどくて上手く伝わってないと思います。
    再投稿させて頂きました。
    https://teratail.com/questions/64810?modal=q-comp

    キャンセル

-1

質問の内容がわかりずらいと思いますので、再度投稿させて頂きます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る