猿问

为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”。


烙印99
浏览 129回答 2
2回答

九州编程

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.RFC4180为CSVFormat.TDF制表符分隔格式。

Helenr

我会使用不同的方法 - BufferedReader. 有了它,您可以获得文件的行流并分别处理每一行。import java.io.*;public class App {    public static void main(String[] args) {        try (BufferedReader reader = new BufferedReader(new FileReader("data.tsv"))) {            reader.lines()                     // Get a stream of lines                .map(line -> line.split("\t")) // Split every line by the tab character                .forEach(App::doStuff);        // Call doStuff for every tokenized line        } catch (IOException e) {            System.out.println("Cannot open the file.");        }    }    static void doStuff(String[] tokens) {        if (tokens.length != 2) {            throw new IllegalArgumentException("Cannot do stuff with an invalid line.");        }        String name = tokens[0]; // tokens[0] contains everything before the tab character        String url = tokens[1];  // tokens[1] contains everything after the tab character        System.out.printf("%s %s\n", name, url);    }}如果你真的想使用 a Scanner,你可以指定分隔符:scan = new Scanner(new File(path)).useDelimiter("[\n\t]");这将使扫描仪仅使用制表符和换行符作为分隔符。请注意,这意味着文件格式不需要完全像这样:'name TAB url NEWLINE name TAB url'。它也可以是'name NEWLINE url TAB name TAB url'。这是因为Scanner不关心分隔符的顺序。如果您真的想使用 aScanner并保留严格的格式,则可以使用 2 个扫描仪。用第一行扫描一行,然后从该行扫描名称和 url。但我认为它太复杂了,我宁愿使用BufferedReader它,因为它确实保留了严格的格式。
随时随地看视频慕课网APP

相关分类

Java
我要回答