使用Java读取时,拒绝文本文件末尾的空行。

问题描述 投票:0回答:4

我需要使用java读取文本文件。不是问题。但我需要拒绝文件末尾的空行。该文件相当大,大约有一百万行左右。我需要一次处理一行。即使它们是空的。

但是,如果空行位于文件的末尾,那么我需要拒绝它。请注意,文件末尾可能有多个空行。

快速解决方案吗?我几乎想写一个FileUtility.trimEmptyLinesAndEnd(文件输入)。但我不能帮助感觉有人可能已经写过这样的东西了。

任何帮助赞赏。

注意:

  1. 我看过这个链接。 Java: Find if the last line of a file is empty。但这不是我想要做的。我需要拒绝多个空行。
java
4个回答
2
投票

找到空行时,增加一个计数器以显示空行数。如果下一行也为空,则递增计数器。如果到达文件末尾,只需继续执行您想要执行的操作(忽略您找到的空行)。如果您到达非空行,请先执行操作以处理空行,然后对每个计算的空行重复此行。然后正常处理非空行,并继续浏览该文件。另外,不要忘记将空行计数器重置为零。

伪代码:

emptyLines = 0;
while (the file has a next line) {
    if (line is empty) {
        emptyLines++;
    } else {
        if (emptyLines > 0) {
            for (i = 0; i < emptyLines; i++) {
                process empty line;
            }
            emptyLines = 0;
        }
        process line;
    }
}

1
投票

您必须阅读文件中的所有行。你可以引入一个保护,它将存储最后一个非空行的值。最后将子集从零返回到监护人。

如果您有流处理。

read line
if empty 
 increase empty lines counter
else 
 if there was some empty lines
   yield fake empty lines that counter store 
   reset counter 
 yield line

0
投票

感谢所有的回复。我认为Vash - DamianLeszczyński和forgivenson都破解了这个问题的伪代码。我已经采取了这一步,并在此提供了Java代码,供那些在我之后寻找答案的人们使用。

@Test
public void test() {

    BufferedReader br = null;

    try {

        String sCurrentLine;
        StringBuffer fileContent = new StringBuffer();
        int consecutiveEmptyLineCounter = 0;

        br = new BufferedReader(new FileReader("D:\\partha\\check.txt"));

        while ((sCurrentLine = br.readLine()) != null) {

            // if this is not an empty line
            if (!(sCurrentLine.trim().length() == 0)) {

                // if there are no empty lines before this line.
                if (!(consecutiveEmptyLineCounter > 0)) {

                    // It is a non empty line, with non empty line prior to this
                    // Or it is the first line of the file.
                    // Don't do anything special with it.
                    // Appending "|" at the end just for ease of debug.
                    System.out.println(sCurrentLine + "|");
                } else {

                    // This is a non empty line, but there were empty lines before this.
                    // The consecutiveEmptyLineCounter is > 0
                    // The "fileContent" already has the previous empty lines.
                    // Add this non empty line to "fileContent" and spit it out.

                    fileContent.append(sCurrentLine);
                    System.out.println(fileContent.toString() + "@");

                    // and by the way, the counter of consecutive empty lines has to be reset.
                    // "fileContent" has to start from a clean slate.
                    consecutiveEmptyLineCounter = 0;
                    fileContent = new StringBuffer();
                }
            } else {
                // this is an empty line

                // Don't execute anything on it.
                // Just keep it in temporary "fileContent"
                // And count up the consecutiveEmptyLineCounter
                fileContent.append(sCurrentLine);
                fileContent.append(System.getProperty("line.separator"));
                consecutiveEmptyLineCounter++;

            }
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (br != null)
                br.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

谢谢你的帮助。

而且,我在这里提供的只是一个解决方案。如果有人遇到更聪明的东西,请分享。我无法摆脱在某处应该有一些FileUtils.trimEmptyLinesAtEnd()方法的感觉。


0
投票

只需向后阅读文件即可。从您阅读的第一行开始,不要处理您遇到的所有空白行。

从您遇到的第一个非空白行开始,然后处理所有行,无论它们是否为空白。

如果您向前阅读文件,问题就是“难以处理”,因为您无法知道在长时间的空行之后是否可能存在非空行。

如果按顺序处理行,从头到尾都很重要,那么就没有简洁的解决方案,现在你所拥有的东西就是有什么。

© www.soinside.com 2019 - 2024. All rights reserved.