在Java中读取.tsv文件
我是一名初学者,我正在尝试用Java读取.tsv数据,并将这些行保存到ArrayList中。我为它写了一个方法,但我得到的唯一东西是行id,没有更多。。。我找不到错误。你能帮帮我吗在Java中读取.tsv文件,java,csv,Java,Csv,我是一名初学者,我正在尝试用Java读取.tsv数据,并将这些行保存到ArrayList中。我为它写了一个方法,但我得到的唯一东西是行id,没有更多。。。我找不到错误。你能帮帮我吗 public static ArrayList<String[]> tsvr(File test2) throws IOException { BufferedReader TSVReader = new BufferedReader(new FileReader(test2)); Str
public static ArrayList<String[]> tsvr(File test2) throws IOException {
BufferedReader TSVReader = new BufferedReader(new FileReader(test2));
String line = TSVReader.readLine();
ArrayList<String[]> Data = new ArrayList<>(); //initializing a new ArrayList out of String[]'s
try {
while (line != null) {
String[] lineItems = line.split("\n"); //splitting the line and adding its items in String[]
Data.add(lineItems); //adding the splitted line array to the ArrayList
line = TSVReader.readLine();
} TSVReader.close();
} catch (Exception e) {
System.out.println("Something went wrong");
}
return Data;
}
publicstaticarraylisttsvr(文件test2)抛出IOException{
BufferedReader TSVReader=新的BufferedReader(新文件读取器(test2));
String line=TSVReader.readLine();
ArrayList Data=new ArrayList();//初始化字符串[]中的新ArrayList
试一试{
while(行!=null){
String[]lineItems=line.split(“\n”);//拆分行并将其项添加到字符串[]
Data.add(lineItems);//将拆分的线数组添加到ArrayList
line=TSVReader.readLine();
}TSVReader.close();
}捕获(例外e){
System.out.println(“出错”);
}
返回数据;
}
首先,您应该将readLine
移动一段时间,以便读取文件的所有行。然后您应该按制表符\t
拆分该行,因为它是一个制表符分隔的文件
public static ArrayList<String[]> tsvr(File test2) {
ArrayList<String[]> Data = new ArrayList<>(); //initializing a new ArrayList out of String[]'s
try (BufferedReader TSVReader = new BufferedReader(new FileReader(test2))) {
String line = null;
while ((line = TSVReader.readLine()) != null) {
String[] lineItems = line.split("\t"); //splitting the line and adding its items in String[]
Data.add(lineItems); //adding the splitted line array to the ArrayList
}
} catch (Exception e) {
System.out.println("Something went wrong");
}
return Data;
}
解释
- 您必须在
(选项卡)上拆分,而不是在\t
(换行符)上拆分。因为您的\n
已经是单行,而不是多行行
- 代码中的另一个问题是手动关闭流,这是不安全的,在异常情况下会造成资源泄漏。您可以使用try with资源安全地关闭它
尼奥 我是否可以建议使用NIO(Java 8或更新版本)的更紧凑、更可读的版本,而不是像其他答案一样修复现有代码
return Files.lines(file.toPath())
.map(line -> line.split("\t"))
.collect(Collectors.toList());
如果你能使你的方法参数现代化,我建议用
Path-Path
代替File-File
,然后你只需做文件。行(Path)
请遵循Java的命名约定。对变量名使用camelCase
,而不是PascalCase
。如您所见,SOs语法突出显示已经变得混乱,并将它们标记为类而不是变量。顺便说一句,对于实际工作(与练习/学习相反),使用库来执行读取制表符分隔文件的繁重工作。例如,ApacheCommonsCSV。您可以在Stack Overflow中找到关于其他问题的整个示例应用程序的源代码。非常感谢!但是如何打印文件呢?使用“sout”,我只看到以下内容:[[Ljava.lang.String;@2d209079[Ljava.lang.String;@6bdf28bb[Ljava.lang.String;@6b71769e[Ljava.lang.String;@2752f6e2[Ljava.lang.String;@e580929[Ljava.lang.String;@1cd072a9]@ta4le请将此作为新问题发布。我更新了答案,您现在可以看到如何打印strings@Zabuza啊,我明白了!!!这是一个字符串数组,而不是单个字符串。谢谢你的提示。如果我的答案有帮助,请单击“接受”图标接受答案。非常感谢!任务有点复杂不同,但我一定会尝试你的方法!
return Files.lines(file.toPath())
.map(line -> line.split("\t"))
.collect(Collectors.toList());