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