2011-01-24 9 views
0

私は情報を引き出す必要のある電子メールをたくさん持っています。私は最近、顧客の連絡先情報を電子メールに保存したサイトを利用しました。彼らはこれをデータベースに保存したいと考えています。私はこの情報を引き出すためにJavaに取り組んでいます。私はこだわっている。テキストファイルから特定の値(名前、電子メール、電話番号)を引き出す

私は自分自身でメールを読み込むことができましたが、の情報を取り出すことができませんでした。ここでは例のメールです:私はどこでも引く=20ありませんする必要が

> ---------------------------------------------------------------------- 
> Name: Person's Name 
> Phone:=20 
> Email: [email protected] 
> Street:=20 
> City:=20 
> State:=20 
> Zip:=20 
> Country:=20 
> Arrival: 15 Nov 2010 
> Departure: 22 Nov 2010 
> Message: This is a message 
> ---------------------------------------------------------------------- 
> Name: Second Person 
> Phone:=555-5554 
> Email: [email protected] 
> Street:=1234 Main St. 
> City:=20 
> State:=20 
> Zip:=23412 
> Country:=20 
> Arrival: 15 Nov 2010 
> Departure: 22 Nov 2010 
> Message: This is a message 
> ---------------------------------------------------------------------- 

。私は何とかこの情報をすべてテーブルやCSVファイルに入れて、mysqlデータベースにインポートする必要があります。

編集:

これは、ファイルには、その "> -------" の行を取得するまで、ファイルを読むより

> ---------------------------------------------------------------------- 
> Name: Erin 
> Phone: 401- 
> Email: eri 
> Street: 737 
> City: Paw 
> State: 
> Zip: 02 
> Country: USA 
> Arrival: 17 Jul 2011 
> Departure: 23 Jul 2011 
> Message: I .=20 
> ---------------------------------------------------------------------- 
>=20 
> A representative will be in touch shortly. 
> Thank You, 
> 
>=20 
Begin forwarded message: 

> From: 
> Date: July 8, 2010 12:35:13 PM EDT 
> To: 
> Subject: Thank you for completing our contact form! 
>=20 
> Thank you for completing our contact form! We received the following = 
information from you: 
> ---------------------------------------------------------------------- 
> Name: Ludd 
> Phone:=20 
> Email: aedu 
> Street: 25 
> City: Signal 
> State: 
> Zip: 
> Country: USA 
> Arrival: 25 Nov 2010 
> Departure: 30 Nov 2010 
> Message: Not sure if 
> ---------------------------------------------------------------------- 
>=20 
> A representative will be in touch shortly. 
> Thank You, 
> 
>=20 
Begin forwarded message: 

> From: 
> Date: July 8, 2010 11:29:49 AM EDT 
> To: 
> Subject: Thank you for completing our contact form! 
>=20 
> Thank you for completing our contact form! We received the following = 
information from you: 
> ---------------------------------------------------------------------- 
> Name: Stephanie 
> Phone: 41 
> Email: sgor 
> Street: 2- 
> City: 
> State: On 
> Zip: 1J6 
> Country: 
> Arrival: 18 Aug 2010 
> Departure: 21 Aug 2010 
> Message:=20 
> ---------------------------------------------------------------------- 
>=20 
> A representative will be in touch shortly. 
> Thank You, 

>=20 
Begin forwarded message: 

> From: 
> Date: July 8, 2010 11:16:36 AM EDT 
> To: 
> Subject: Thank you for completing our contact form! 
>=20 
> Thank you for completing our contact form! We received the following = 
information from you: 
> ---------------------------------------------------------------------- 
> Name: Stacey 
> Phone: 001 
> Email: staceymou 
> Street: 60 
> City: New York 
> State: NY 
> Zip: 0 
> Country: USA 
> Arrival: 10 Dec 2010 
> Departure: 14 Dec 2010 
> Message: Looking to reserve 
> ---------------------------------------------------------------------- 

答えて

2

このようなヘッダーをすべてMap<String, String>に抽出する方法です。 GoogleのGuava libraryを使用して多くのものを簡略化しています。

public static Map<String, String> readValuesFromFile(final File f) 
    throws IOException{ 

    final Splitter splitter = 
     Splitter.on(':').trimResults().omitEmptyStrings(); 

    final Map<String, String> map = Maps.newHashMap(); 

    for(final String line : 

     Lists.transform(
      Files.readLines(f, Charsets.UTF_8), 
      new Function<String, String>(){ 

       @Override 
       public String apply(final String input){ 
        return input != null && input.startsWith("> ") 
         ? input.substring(2) 
         : input; 
       } 

    })){ 

     if(line.startsWith("---")){ 
      break; 
     } 
     final String[] items = 
      Iterables.toArray(splitter.split(line), String.class); 
     if(items.length == 2 && !items[1].startsWith("=20")){ 
      map.put(items[0], items[1]); 
     } 
    } 
    return map; 
} 
+0

Hey man。手伝ってくれてどうもありがとう。私はもう少しあなたの方法を乱してきましたが、私が必要とするように正確に動作させることはできません。最後のエントリだけを取得するようです。私はそれが最後の1つではなく、複数のエントリを取得するエントリの3つを持っていると言う。なぜそれが起こっているのか分かりません。私はline.startsWith( "---"))を実行しなければならなかったので、それを取り出さなければなりませんでした。何か案は?助けてくれてありがとう。 –

+0

@dham about 'line.startsWith()'申し訳ありませんが、ヘッダーもダッシュであるとは見えませんでした。また、あなたは複数の価値を持っているとは言いませんでした。あなたは何をしているのですか?複数の行が同じ接頭辞または複数の値を1つの行に含みます。それをあなたの質問に追加してください。 –

+0

@dhamああ、私はあなたを得ると思います。メソッド呼び出しごとに複数のファイルを読んでいます。しないでください:1つのマップは1つのファイルを表します。地図のリストを保持する。 –

0

どのように見えるかを、実際にあります。 すべての行(BufferedReader.readLine())を読み込み、その中に ":"の位置を見つけ、前に行の一部をとります(String.indexOf()String.substring()String.trim()を使用)。今あなたはフィールドとその価値の名前を持っています。値が「= 20」以外の場合は、データベースまたはCSVレコードに入れます。

"> -------"行が再び発生すると、レコードは終了します。あなたはそれに「:」がないという事実によってそれを簡単に検出することができます。

関連する問題