nkvnkv
nkvnkv

Reputation: 954

java remove lines from file based on line number

Is there a Java library to remove lines based on line number?

My aim is to remove lines based on line numbers.

Example

  1. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis
  2. egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante.
  3. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris
  4. placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum
  5. erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit
  6. eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui.
  7. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus
  8. faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat
  9. volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus

remove lines 3,4,5 output should be

  1. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis
  2. egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante.
  3. eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui.
  4. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus
  5. faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat
  6. volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus

I have made a working method

 import org.apache.commons.io.FileUtils;
//...
 private String removeLines(List<Integer> removeLines, File text) throws IOException {
        List<String> textLines = FileUtils.readLines(text, StandardCharsets.UTF_8);
        if (argsStrings.contains(Flags.DEBUG_FLAG)) {
            String format = String.format("%d from %d need to be removed", removeLines.size(), textLines.size());
            Logger.getLogger(App.class.getName()).log(Level.INFO, format);
        }
        int i = textLines.size();
        while (!removeLines.isEmpty()) {

            Integer line = new Integer(i + 1);
            if (argsStrings.contains(Flags.DEBUG_FLAG)) {

                String format = String.format("%4d. line inspected", line);
                Logger.getLogger(App.class.getName()).log(Level.INFO, format);
            }
            if (removeLines.contains(line)) {
                if (argsStrings.contains(Flags.DEBUG_FLAG)) {

                    String format = String.format("%4d. line removed, line text is below%n%s", line, textLines.get(i));
                    Logger.getLogger(App.class.getName()).log(Level.INFO, format);
                }
                textLines.remove(i);
                removeLines.remove(line);

            }
            i--;
        }
        StringBuilder sb = new StringBuilder();

        for (String line : textLines) {
            sb.append(line);
            sb.append(System.lineSeparator());
        }
        return sb.toString();
    }

Is there a simpler way to do this?

Upvotes: 1

Views: 1040

Answers (1)

Robby Cornelissen
Robby Cornelissen

Reputation: 97140

Since you don't seem to mind reading the entire file into memory, try this:

private String removeLines(List<Integer> removeLines, File text) throws IOException {
    List<String> textLines = FileUtils.readLines(text, StandardCharsets.UTF_8);

    for(Integer removeLine : removeLines) {
        textLines.remove(removeLine - 1); // -1, depending on how you specify removeLines
    }

    StringBuilder builder = new StringBuilder();

    for(String line : textLines) {
        builder.append(line).append(System.lineSeparator());
    }

    return builder.toString();   
}

Alternatively, you could also do something like this, using a LineIterator:

private String removeLines(List<Integer> removeLines, File text) throws IOException {
    StringBuilder builder = new StringBuilder();
    LineIterator it = FileUtils.lineIterator(text, StandardCharsets.UTF_8);

    try {
        for (int i = 1; it.hasNext(); i++) {
            String line = it.nextLine();

            if(!removeLines.contains(i)) {
                builder.append(line).append(System.lineSeparator());
            }
        }
    } finally {
        LineIterator.closeQuietly(it);
    }

    return builder.toString();   
}

Upvotes: 1

Related Questions