簡體   English   中英

如何在Java文本文件中找到選項卡式行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM