【问题标题】:Creating email addresses from names in a text file从文本文件中的名称创建电子邮件地址
【发布时间】:2017-11-12 10:38:44
【问题描述】:

我有一个文本文件,每行都有一个名字(名字+姓氏),我想从这些名字中创建电子邮件地址(格式为:firstname.familyname@address.com。)。

我的计划是这样做:

  1. 为文本文件中的每一行创建一个包含字符串的数组
  2. 将每个字符串分成两部分:名字、姓氏。其中名字是字符串中的第一个单词,姓氏是每隔一个单词。
  3. 为每个字符串(总共 N 个字符串)创建一个新数组 (splitNameN),其中包含两个元素:名字、姓氏
  4. 从每个 splitNameN 数组中,创建一个新字符串:“first name” + “.” +"姓氏"+"@mail.com"
  5. 将所有这些字符串加在一起,用逗号分隔(例如:barrack.obama@mail.com;donald.trump@mail.com)

我不知道该怎么做的主要事情是拆分名称并将它们放入正确的数组中,我可以拆分它们但是它们会丢失它们的分组。

    public static void main(String[] args)  throws IOException
    {
      File file = new File("D:\\NetbeansProjects\\Emails\\src\\emails\\lijst.txt");
      BufferedReader abc = new BufferedReader(new FileReader(file));
      List<String> data = new ArrayList<String>();
      String s;
      while((s=abc.readLine())!=null) {
        data.add(s);
      }
      abc.close();
      System.out.println(data);
      List<String> splitdata = new ArrayList<String>();
      for(String strLine : data) {
        String[] strWord = strLine.split("[\\s']");
        for (String c : strWord) {
                splitdata.add(c);     
        }
      }
      System.out.println(splitdata);
    }

【问题讨论】:

  • 专业提示。始终小心地缩进你的程序。它使它们更容易阅读和检查。大多数编辑器和 IDE 可以自动执行此操作。
  • 你会创建像 MikeO'Donell 这样的电子邮件,注意撇号。如果有两个 JimSmith 怎么办?

标签: java arrays string split


【解决方案1】:

你的解释中缺少循环中的一部分,你的行就像:

firstname1 familyname1
firstname2 familyname2

所以拆分后你可以轻松使用:

for (String strLine : data) {
    String[] strWord = strLine.split("[\\s']");

    splitdata.add(strWord[0] + "." + strWord[1] + "@mail.com");
    //------------first name         last name
}
System.out.println(splitdata);

输出:

[firstname1.familyname1@mail.com, firstname2.familyname2@mail.com]

注意你必须在使用之前验证你的名字,如果名字有很多部分,你必须在名字之间使用正确的分隔符。

【讨论】:

    【解决方案2】:

    读取数据后,您可以创建一个二维数组并在其中存储名字和姓氏,然后将它们连接起来以创建您要求的电子邮件地址。

    String[][] splitdata = new String[data.size()][2];
    int rowNum = 0;
    for (String strLine : data) {
        String[] strWord = strLine.split("[\\s]");
        // Store it in an array as you asked for or join them right here
        splitdata[rowNum][0] = strWord[0];
        splitdata[rowNum][1] = strWord[1];
        ++rowNum;
    }
    for (String[] row: splitdata) {
        System.out.println(row[0] + "." + row[1] + "@mail.com");
    }
    

    如果你使用的是 java8,那么整个事情都写成..

    Path path = Paths.get("D:\\NetbeansProjects\\Emails\\src\\emails\\lijst.txt");
    String commaJoinedEmails = String.join(",", Files.lines(path)
        .map(line -> line.split("\\s"))
        .map(tokens -> tokens[0] + "." + tokens[1] + "@mail.com")
        .toArray(String[]::new));
    

    【讨论】:

    • 非常感谢!除了姓氏可以由用空格分隔的多个单词组成之外,这几乎可以完美地工作。通过向 split 命令添加参数并从 strWord[1] 中删除空格后,我很容易解决这个问题。 String[] strWord = strLine.split("[\\s']",2); splitdata[rowNum][0] = strWord[0]; String samen = strWord[1].replaceAll(" ",""); splitdata[rowNum][1] = samen; ++rowNum;
    【解决方案3】:

    我建议你逐行阅读文件。

    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
    String line;
    while ((line = br.readLine()) != null) {
       // process the line.
    }
    

    这是最常见的做法。在当前行参数中,您将存储名字和姓氏,之后您可以处理这两个名称(最好使用 StringBuffer)并将结果添加到您选择的最终字符串中。

    祝你好运:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      • 2011-05-15
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多