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

问题描述 投票:0回答:1

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

请找到我需要解析的示例文本文件内容:FirstName || lastName || Age || Salary

香港||王|| 20 || $ 1000个

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

马克||更丰富|| 30 || $ 12000

斯宾塞||库克|| 31 || $ 700


我现在得到的结果:

名字

年龄

薪水

Kong

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();
    }

我需要的结果如下:

FirstName - > Kong

lastName - >国王

年龄 - > 20岁

薪水 - > 1000美元


FirstName - >史蒂夫

姓氏 - >罗杰斯

年龄 - >

薪水 - > 2000美元

任何帮助表示赞赏..

java spring parsing java.util.scanner bufferedreader
1个回答
-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
© www.soinside.com 2019 - 2024. All rights reserved.