2 回答
TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個(gè)贊
String::split
我不知道怎么說“在制表符之前獲取所有內(nèi)容并將其存儲(chǔ)到變量名”和“將所有內(nèi)容從制表符獲取到新行并將其存儲(chǔ)到變量 url”。
使用該String::split方法將字符串切成更小的字符串。指定每行字段之間使用的分隔符 ( TAB )。你得到一個(gè)對(duì)象數(shù)組,String每個(gè)字段對(duì)應(yīng)一個(gè)對(duì)象。
String[] fields = line.split( "\t" ) ; // Chop string into smaller strings.
String name = fields[ 0 ] ; // Annoying zero-based index counting.
String url = fields[ 1 ] ;
您應(yīng)該添加一些代碼來驗(yàn)證您在數(shù)組大小中獲得了預(yù)期的字段數(shù)。
提示:使用庫來執(zhí)行讀取和寫入制表符分隔文件的繁瑣工作。我使用Apache Commons CSV庫來完成此類工作。它處理各種CSV格式以及制表符分隔。在 Stack Overflow 中搜索示例,例如我昨天發(fā)布的示例。在該示例代碼中,將 更改CSVFormat.RFC4180為CSVFormat.TDF制表符分隔格式。
TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超4個(gè)贊
我會(huì)使用不同的方法 - 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]");
這將使掃描儀僅使用制表符和換行符作為分隔符。請(qǐng)注意,這意味著文件格式不需要完全像這樣:'name TAB url NEWLINE name TAB url'。它也可以是'name NEWLINE url TAB name TAB url'。這是因?yàn)镾canner不關(guān)心分隔符的順序。
如果您真的想使用 aScanner并保留嚴(yán)格的格式,則可以使用 2 個(gè)掃描儀。用第一行掃描一行,然后從該行掃描名稱和 url。但我認(rèn)為它太復(fù)雜了,我寧愿使用BufferedReader它,因?yàn)樗_實(shí)保留了嚴(yán)格的格式。
添加回答
舉報(bào)
