解析由|分隔的文本文件运算符并保​​留标题列名称

时间:2019-04-06 08:58:52

标签: java spring parsing java.util.scanner bufferedreader

我有一个文本文件,其中的字段由|分隔。操作员。 txt文件的第一行包含“名称”列。我能够基于|解析和拆分字段操作员使用Scanner,但我需要每个字段值的标题列名称

请在下面找到我需要解析的示例文本文件内容: 名字||姓氏||年龄||薪水

Kong || King || 20 || $ 1000

史蒂夫||罗杰斯|| || $ 2000

马克||里奇|| 30 || $ 12000

Spencer || Cook || 31 || $ 700


我现在得到的结果:

名字

姓氏

年龄

工资

国王

20

$ 1000

史蒂夫

罗杰斯

$ 2000

标记

富人

30

$ 12000

喷枪

烹饪

31

700美元


我使用的示例代码:

    FileInputStream inputStream = new FileInputStream("c:\\sample\\sample.txt");
    Scanner scanner = new Scanner(inputStream, "UTF-8");
    scanner.useDelimiter("[\\||]");
    while(scanner.hasNext()){
        System.out.println(scanner.next().trim());

    }
    scanner.close();
    }

我需要的结果如下:

名字-> Kong

姓氏->国王

年龄-> 20

工资-> $ 1000


名字->史蒂夫

姓氏->罗杰斯

年龄->

工资-> $ 2000

感谢您的帮助。

1 个答案:

答案 0 :(得分:-1)

不知道这是否是最有效的解决方案,但可以像这样管理它,希望对您有所帮助! :)文件路径不同,因为我在Linux中。

FileInputStream inputStream = new FileInputStream("/home/dzandes/Music/test.txt");
Scanner scanner = new Scanner(inputStream, "UTF-8");
scanner.useDelimiter("[\\||]");

List<String> contents = new ArrayList<>();

while (scanner.hasNext()) {

     String s = scanner.next().trim();

     // First, we split the Strings with new line in between
     if (!s.isEmpty()) {
          if (s.contains("\n")) {
              String[] s_ = s.split("\n");
              for (String str : s_) {
                   contents.add(str);
               }
           } else {
               contents.add(s);
           }       
      } else {
           contents.add(s);
      }
 }
 scanner.close();

 // Then we keep the necessary empty Strings we need, e.g. Steve Roger's age, and skip the rest
 List<String> contents_ = new ArrayList<>();
 for (int j = 0; j < contents.size(); j++) {
      if (!contents.get(j).isEmpty()) {
           contents_.add(contents.get(j));
      } else {
           if (contents.get(j+1).isEmpty() 
                  && contents.get(j-1).isEmpty()) {
               contents_.add(contents.get(j));
            }
       }
  }

  /**
   * Just left this for-loop to see what the list contains after the above
   * 
   * Of course, you can comment it
   */
   for (String s : contents_) {
       System.out.println("s :" + s);
   }

   int i = 1;
   while (i*4 < contents_.size()) {
        System.out.println(contents_.get(0) + " - " + contents_.get(i*4));
        System.out.println(contents_.get(1) + " - " + contents_.get((i*4) + 1));
        System.out.println(contents_.get(2) + " - " + contents_.get((i*4) + 2));
        System.out.println(contents_.get(3) + " - " + contents_.get((i*4) + 3));
        i++;
    }

它打印,

FirstName - Kong
lastName - King
Age - 20
Salary - $1000
FirstName - Steve
lastName - Rogers
Age - 
Salary - $2000
FirstName - Mark
lastName - Richer
Age - 30
Salary - $12000
FirstName - Spencer
lastName - Cook
Age - 31
Salary - $700