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

时间:2014-06-26 15:10:14

标签: java

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

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

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

任何帮助表示赞赏。

注意:

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

4 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分: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()方法的感觉。

答案 3 :(得分:0)

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

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

如果您向前阅读文件,问题就是“难以处理”,这是一个简洁的解决方案,因为您无法知道在长时间的空白行之后的某个时刻是否可能存在非空行。

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