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

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

新規登録して質問してみよう
ただいま回答率
85.49%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Q&A

解決済

4回答

1948閲覧

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

yuki_90453

総合スコア326

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

0グッド

0クリップ

投稿2017/02/06 06:39

編集2017/02/06 07:09

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

メールはテキストメールであり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メールではありません。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masaya_ohashi

2017/02/06 06:44

前提が確認したいのですが、あなたが求めている扱いやすい形式とは、「メールを送る側」が選ぶべき形式であってますか?それとも「メールを受け取る側」が解析するための手法ですか?
t_obara

2017/02/06 06:45

何らか提示されていない条件があるのであれば、それを提示されることをお勧めします。そのテキストを扱う言語は何かとか、サイズはどの程度になりそうだとか。
masaya_ohashi

2017/02/06 06:45

わかりにくいので追記しますが、あなたは「送信するメール」の形式を変えたい、という認識であってますか?
yuki_90453

2017/02/06 06:56

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

2017/02/06 06:59

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

2017/02/06 06:59

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

回答4

0

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

投稿2017/02/06 09:11

yuki_90453

総合スコア326

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

投稿2017/02/06 08:54

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki_90453

2017/02/06 09:08

回答ありがとうございます。 私が意図しているのは、上記のテキストから[受注番号]や[商品名]などの情報を取得しやすいように変換したいと考えております。テキストファイルで出力した場合、取得したい情報を得るのに正規表現が必要かと思いますが、私は正規表現が苦手なので正規表現を使いたくないと考えております。 理想としては、HTMLやXMLのようなマークアップ言語で[受注番号]や[商品名]などをタグで囲み、セレクターで内容を取得が出来ればと考えているのですが、出力方法をXMLに指定しても自動でマークアップされません。 出力する時に、マークアップする文字列を指定しなければいけないと思います。その際に正規表現を使うのであれば、テキスト形式で出力するのとやっている事は同じです。 >受信したメールを解析して、プログラム上扱いやすいフォーマットに変換する方法と理解しました。 もちろんプログラム上で扱うので間違ってはいないのですが、取得したい情報(例えば商品名)を正規表現を使わず、かんたんな方法で取得出来る方法を探しています。
t_obara

2017/02/06 09:29

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

0

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

投稿2017/02/06 07:33

otn

総合スコア84487

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki_90453

2017/02/06 09:10

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

2017/02/06 09:14

もしかして、「適当に指定すれば、自分でテキストを解釈せず、自動的にうまくやってくれる」とか思っていますか? それはAI搭載言語でもないと無理です。 自分でテキストを解釈した上で、そのデータをどの形式で保存するのがいいかという質問だと思って回答しました。
guest

0

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

Ruby

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

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

投稿2017/02/06 07:22

masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki_90453

2017/02/06 09:28

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

2017/02/06 09:37

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問