Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从文本文件中提取特定值(姓名、电子邮件、电话号码)_Java_Regex_Email_String - Fatal编程技术网

Java 从文本文件中提取特定值(姓名、电子邮件、电话号码)

Java 从文本文件中提取特定值(姓名、电子邮件、电话号码),java,regex,email,string,Java,Regex,Email,String,我有一大堆电子邮件需要从中获取信息。我最近访问了一个网站,该网站将客户的所有联系信息存储在电子邮件中。他们希望开始将其存储在数据库中。我正在与Java合作,试图提取这些信息。我有点困了 我可以自己加载电子邮件,但无法提取信息。以下是一封电子邮件示例: > ---------------------------------------------------------------------- > Name: Person's Name > Phone:=20 > Ema

我有一大堆电子邮件需要从中获取信息。我最近访问了一个网站,该网站将客户的所有联系信息存储在电子邮件中。他们希望开始将其存储在数据库中。我正在与Java合作,试图提取这些信息。我有点困了

我可以自己加载电子邮件,但无法提取信息。以下是一封电子邮件示例:

> ----------------------------------------------------------------------
> Name: Person's Name
> Phone:=20
> Email: test@testperson.com
> 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: test@testpsdf.com
> 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
> ----------------------------------------------------------------------
我需要在没有
=20
的地方拉。我需要以某种方式将所有这些信息输入到一个表或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 
> ----------------------------------------------------------------------

读取该文件,直到得到“>----”行。 阅读每一行(
BufferedReader.readLine()
),找到“:”的位置,在该行之前和之后取该行的一部分(使用
String.indexOf()
String.substring()
String.trim()
)。现在您有了字段的名称及其值。除非值为“=20”,否则将其放入数据库或CSV记录中


如果再次遇到“>----”行,则记录结束。您可以通过在其中也没有“:”这一事实轻松地检测到它。

这里有一个方法,可以将所有这样的头提取到
映射中。它利用谷歌的技术简化了很多事情:

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;
}
publicstaticmap readValuesFromFile(最终文件f)
抛出IOException{
最终分离器=
Splitter.on(':').trimResults().omitEmptyStrings();
final Map=Maps.newHashMap();
对于(最后一行字符串:
列表。转换(
文件.readLines(f,Charsets.UTF_8),
新函数(){
@凌驾
公共字符串应用(最终字符串输入){
返回输入!=null&&input.startsWith(“>”)
?输入子串(2)
:输入;
}
})){
if(第行开始,以“--”号填列){
打破
}
最终字符串[]项=
Iterables.toArray(splitter.split(line)、String.class);
如果(items.length==2&&!items[1].startsWith(“=20”)){
映射放置(项目[0],项目[1]);
}
}
返回图;
}

嘿,伙计。非常感谢你的帮助。我对你的方法做了更多的修改,但不能完全按照我的需要去做。它似乎只得到最后一个条目。假设我有3个条目,它只得到最后一个条目,而不是多个条目。我不知道为什么会这样。我不得不将line.startsWith(“--”)取出,因为它不起作用。有什么想法吗?谢谢您的帮助。@dham about
line.startsWith()
对不起,没有看到标题也是破折号。另外,您没有提到您有多个值。你认为呢?男人:多行具有相同前缀或一行中有多个值。请把它附在你的question@dham哦,我想我明白了,每个方法调用读取的文件不止一个。不要这样做:一个映射代表一个文件。保留一张地图的清单。嘿,伙计。我用一个例子更新了原来的帖子。非常感谢你的帮助!