java根据行号从文件中删除行

时间:2014-06-26 12:28:50

标签: java file file-io numbers line

是否有基于行号删除行的Java库?

我的目标是根据行号删除行。

实施例

  1. Pellentesque居住者morbi tristique senectus et netus et malesuada fames ac turpis
  2. egestas。 Vestibulum tortor quam,feugiat vitae,ultricies eget, 时间安静,安息。
  3. Donec eu libero坐在amet quam egestas semper。 Aenean ultricies mi vitae est.Mauris
  4. placerat eleifend leo。 Quisque坐在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
  10. 删除行3,4,5输出应

    1. Pellentesque居住者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
    7. 我已经制定了一种工作方法

       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();
          }
      

      有更简单的方法吗?

1 个答案:

答案 0 :(得分:1)

由于您似乎不介意将整个文件读入内存,请尝试以下操作:

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();   
}

或者,您也可以使用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();   
}