[英]How do I find tabbed lines in text file in Java?
我有如下所示的文本文件。
Product Name
HP Compaq Elite 8300 CMT
(HP Compaq Elite 8300 CMT獨立運行,並且在其前面有一個制表符空間)
我試圖找到一種方法來逐行讀取並從選項卡開始刪除行。 首先,我將文件轉換為字符串列表:
public static List<String> readFile2(File file) throws IOException {
FileInputStream fis = new FileInputStream(file);
List<String> list = new ArrayList<>();
//Construct BufferedReader from InputStreamReader
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String line = null;
while ((line = br.readLine()) != null) {
list.add(br.readLine());
}
br.close();
return list;
}
並且我在讀取列表時在循環中嘗試了許多不同的語句,但未返回正確的行:
for(int i=0; i<list.size(); i++)
{
if(list.get(i).indexOf("\u0009")>-1 || list.get(i).contains("\u0009") || list.get(i).indexOf((char)9)>-1 || list.get(i).startsWith(" ") || list.get(i).startsWith("\t"))
{
list.remove(i);
}
}
有什么建議么? 謝謝!
Java的String
類具有startsWith
方法,該方法使您可以測試String是否以給定前綴開頭。 您可以使用它來標識以制表符開頭的行。 通過使用它,您可以測試剛從緩沖區讀出的行,而不將其添加到列表的第一位。
String line = null;
while ((line = br.readLine()) != null) {
if(!line.startsWith("\u0009")) {
list.add(line);
}
}
其他答案建議(更好的1 )替代方法,這些方法首先避免將匹配的行放入列表中。
這是為什么您的版本不起作用的說明:
for (int i = 0; i < list.size(); i++) {
if (/* match line */) {
list.remove(i);
}
}
問題是,當刪除第ith個列表元素時,位於較大索引處的所有元素都會被“重新編號”; 例如list.get(i + 1)
變為list.get(i)
,依此類推。
但是,接下來要做的就是增加i
。 因此...實際上...刪除元素時,不會檢查下一個元素。
這是正確的方法:
int i = 0;
while (i < list.size()) {
if (/* match line */) {
list.remove(i);
} else {
i++;
}
}
請注意,如果刪除第i
個元素,則不要遞增i
。
為了記錄在案,您使用的任何一項測試都足以匹配包含TAB的行。 用不同的方式編寫相同的測試無濟於事。 有一個教訓給你...
1-它更簡單(代碼更少),並且在處理大文件時也顯着提高了效率。 從ArrayList
的任意位置刪除元素是O(N)
操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.