亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為java中的每一行存儲制表符分隔的TSV文件中的變量

為java中的每一行存儲制表符分隔的TSV文件中的變量

烙印99 2022-07-27 10:04:28
我嘗試在 Java 中讀取制表符分隔的 TSV 文件,并希望將每行的值存儲在 2 個變量中。(變量名:制表符之前的所有內容,變量 2:制表符之后的所有內容)。該文件如下所示:Name1 Lastname1 TAB directory1/subdir1/subdir11Name2 SecondName2 Lastname2 TAB directory1/subdir2/subdir22所以我有 1)姓名和姓氏,用空格分隔 2)制表符 3)沒有空格的 url 4)新行(在最后一個 url 字符之后,以便下一個條目從新行開始)我遵循了一個教程,而我已經擁有的是:// Open TSV Filepublic 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”。
查看完整描述

2 回答

?
九州編程

TA貢獻1785條經驗 獲得超4個贊

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制表符分隔格式。


查看完整回答
反對 回復 2022-07-27
?
Helenr

TA貢獻1780條經驗 獲得超4個贊

我會使用不同的方法 - 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它,因為它確實保留了嚴格的格式。


查看完整回答
反對 回復 2022-07-27
  • 2 回答
  • 0 關注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號