[英]Java search text file for string only using charAt() and length()
[英]Search for a String in a Text File using Java 8
我有一個很長的文本文件,我想閱讀並從中提取一些數據。 使用JavaFX和FXML,我使用FileChooser加載文件以獲取文件路徑。 我的controller.java有以下內容:
private void handleButtonAction(ActionEvent event) throws IOException {
FileChooser fileChooser = new FileChooser();
FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("TXT files (*.txt)", "*.txt");
fileChooser.getExtensionFilters().add(extFilter);
File file = fileChooser.showOpenDialog(stage);
System.out.println(file);
stage = (Stage) button.getScene().getWindow();
}
文本文件示例:請注意,某些文件內容分為2行。 例如-Ba \\ 10.10.10.3是第一行的一部分。
net ip-interface create 10.10.10.2 255.255.255.128 MGT-1 -Ba \
10.10.10.3
net ip-interface create 192.168.1.1 255.255.255.0 G-1 -Ba \
192.168.1.2
net route table create 10.10.10.5 255.255.255.255 10.10.10.1 -i \
MGT-1
net route table create 10.10.10.6 255.255.255.255 10.10.10.1 -i \
MGT-1
我正在尋找一種方法來搜索此(文件)並輸出以下內容:
MGT-1 ip-interface 10.10.10.2
MGT-1 Backup ip-interface 10.10.10.3
G-1 ip-interface 192.168.1.1
G-1 Backup Ip-interface 192.168.1.2
MGT-1 route 10.10.10.5 DFG 10.10.10.1
MGT-1 route 10.10.10.6 DFG 10.10.10.1
當然,您可以使用BufferedReader.lines
或Files.lines
將輸入文件作為行流Files.lines
。 然而,這里棘手的是如何處理尾隨的"\\"
。 有幾種可能的解決方案。 您可以編寫自己的Reader
來包裝現有的Reader
然后忽略EOL后面的斜杠。 或者,您可以編寫自定義Iterator
或Spliterator
,它將BufferedReader.lines
流作為輸入並處理此案例。 我建議使用我的StreamEx庫,它已經有一個方法用於collapse
這樣的任務:
StreamEx.ofLines(reader).collapse((a, b) -> a.endsWith("\\"),
(a, b) -> a.substring(0, a.length()-1).concat(b));
第一個參數是應用於兩個相鄰行的謂詞,如果應合並行,則應返回true。 第二個參數是實際合並兩行的函數(我們通過substring
切斷斜杠,然后連接下一行)。
現在,您可以按空格分割線條,並根據您的任務將其轉換為一條或兩條輸出線條。 最好通過單獨的方法來做到這一點。 整個代碼:
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.regex.Pattern;
import java.util.stream.Stream;
import javax.util.streamex.StreamEx;
public class ParseFile {
static Stream<String> convertLine(String[] fields) {
switch(fields[1]) {
case "ip-interface":
return Stream.of(fields[5]+" "+fields[1]+" "+fields[3],
fields[5]+" Backup "+fields[1]+" "+fields[7]);
case "route":
return Stream.of(fields[8]+" route "+fields[4]+" DFG "+fields[6]);
default:
throw new IllegalArgumentException("Unrecognized input: "+
String.join(" ", fields));
}
}
static Stream<String> convert(Reader reader) {
return StreamEx.ofLines(reader)
.collapse((a, b) -> a.endsWith("\\"),
(a, b) -> a.substring(0, a.length()-1).concat(b))
.map(Pattern.compile("\\s+")::split)
.flatMap(ParseFile::convertLine);
}
public static void main(String[] args) throws IOException {
try(Reader r = new InputStreamReader(
ParseFile.class.getResourceAsStream("test.txt"))) {
convert(r).forEach(System.out::println);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.