首页 > 解决方案 > 为java中的每一行存储制表符分隔的TSV文件中的变量

问题描述

我尝试在 Java 中读取制表符分隔的 TSV 文件,并希望将每行的值存储在 2 个变量中。(变量名:制表符之前的所有内容,变量 2:制表符之后的所有内容)。该文件如下所示:

Name1 Lastname1 TAB directory1/subdir1/subdir11
Name2 SecondName2 Lastname2 TAB directory1/subdir2/subdir22

所以我有 1)姓名和姓氏,用空格分隔 2)制表符 3)没有空格的 url 4)新行(在最后一个 url 字符之后,以便下一个条目从新行开始)

我遵循了一个教程,而我已经拥有的是:

// Open TSV File
public static Scanner openFile(String path) {
    try {
        Scanner scan;
        scan = new Scanner(new File(path)); 
        System.out.println("TSV-File found");
        return scan;
    } catch (Exception e) {
    System.out.println("TSV-File not found");
    }
    return null;
}   

public static void readFile(Scanner scan) {
    while(scan.hasNext()) { 
        String name = scan.next();
        String url = scan.next();
        System.out.printf("%s %s\n", name, url);
    }
}

问题出在我的 readFile() 方法中,因为我不知道如何说“在制表符之前获取所有内容并将其存储到变量名”和“将所有内容从制表符获取到新行并将其存储到变量 url”。

谢谢和问候,帕特里克

标签: javacsv

解决方案


String::split

我不知道怎么说“在制表符之前获取所有内容并将其存储到变量名”和“将所有内容从制表符获取到新行并将其存储到变量 url”。

使用该String::split方法将字符串切成更小的字符串。指定每行字段之间使用的分隔符 ( TAB )。你得到一个对象数组,String每个字段对应一个对象。

String[] fields = line.split( "\t" ) ;    // Chop string into smaller strings.
String name = fields[ 0 ] ;               // Annoying zero-based index counting.
String url = fields[ 1 ] ;

您应该添加一些代码来验证您在数组大小中获得了预期的字段数。

提示:使用库来执行读取和写入制表符分隔文件的繁琐工作。我使用Apache Commons CSV库来完成此类工作。它处理各种CSV格式以及制表符分隔。在 Stack Overflow 中搜索示例,例如昨天发布的示例。在该示例代码中,将 更改CSVFormat.RFC4180CSVFormat.TDF制表符分隔格式。


推荐阅读