Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/83.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中读取.tsv文件_Java_Csv - Fatal编程技术网

在Java中读取.tsv文件

在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

我是一名初学者,我正在尝试用Java读取.tsv数据,并将这些行保存到ArrayList中。我为它写了一个方法,但我得到的唯一东西是行id,没有更多。。。我找不到错误。你能帮帮我吗

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