Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.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_Spring_Parsing_Java.util.scanner_Bufferedreader - Fatal编程技术网

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

Java 解析由|运算符分隔的文本文件并保留标题列名,java,spring,parsing,java.util.scanner,bufferedreader,Java,Spring,Parsing,Java.util.scanner,Bufferedreader,我有一个文本文件,其中字段由|运算符分隔。txt文件的第一行包含列名。我可以使用Scanner根据|运算符解析和拆分字段,但我需要每个字段值的标题列名 请在下面找到我需要解析的示例文本文件内容: 名| |姓| | |年龄| |薪水 香港| |国王| 20 | | | 1000美元 史蒂夫·罗杰斯2000美元 马克| |富| 30 | | | 12000美元 斯宾塞·库克·31·700美元 我现在得到的结果是: 名字 姓氏 年龄 薪水 香港 国王 二十 1000美元 史蒂夫 罗杰斯 2000美元

我有一个文本文件,其中字段由|运算符分隔。txt文件的第一行包含列名。我可以使用Scanner根据|运算符解析和拆分字段,但我需要每个字段值的标题列名

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

香港| |国王| 20 | | | 1000美元

史蒂夫·罗杰斯2000美元

马克| |富| 30 | | | 12000美元

斯宾塞·库克·31·700美元

我现在得到的结果是:

名字

姓氏

年龄

薪水

香港

国王

二十

1000美元

史蒂夫

罗杰斯

2000美元

标记

富裕的

三十

12000美元

斯宾塞

烹调

三十一

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();
    }
我需要的结果如下:

名字->香港

姓氏->国王

年龄->20岁

工资->1000美元

名字->史蒂夫

姓氏->罗杰斯

年龄->

工资->2000美元


非常感谢您的帮助。

不知道这是否是最有效的解决方案,但还是这样管理,希望能有所帮助!:文件路径不同,因为我在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++;
    }

只需使用任何标准的CSV库,停止重新发明轮子。任何解析器都可以在几行代码中正确地完成这项工作。我建议您为您的对象创建一个bean类型,然后读入bean列表。文件路径不同,因为我在Linux中。-Java是平台无关的;你的操作系统与路径语法无关。只是提到了它,这样我们的朋友在检查响应时就不会觉得奇怪了。我试图帮助我找到一个有效的解决方案,即使它不是我提到的最有效的解决方案。我想我们是来互相帮助和学习的。。。如果你认为这一努力值得投反对票,那么,恭喜你,你是今天最酷的家伙!提示:只需使用两个扫描仪,就可以编写比这更好的代码。我没有因为路径而投反对票,我投反对票有两个原因-1这基本上是一个只使用代码的答案,绝对没有解释你在做什么或它是如何工作的-正如你指出的,这是一个教学网站,2代码很混乱,很难理解,由于使用了一台扫描仪,所以出现了一些奇怪的解决方法——如果你要发布一个答案,请确保它干净、正确。问这个问题的人使用了扫描仪,这就是为什么我保持原样的原因。其余的只是一些带有相关注释的FOR和ifs,而不是任何难以理解的奇怪解决方法。即使这很奇怪,他也可以自己问,我很乐意作进一步解释。你所做的是阅读这个解决方案,任何人都可以这样做。无论如何,我不会再继续这样下去了,我尊重你的意见,尽管我完全不同意你的想法。
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