首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java根据行号从文件中删除行

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

Stack Overflow用户
提问于 2014-06-26 12:28:49
回答 1查看 1K关注 0票数 1

是否有根据行号删除行的Java库?

我的目标是删除基于行号的行。

示例

  1. 蜂巢式居住者morbi三世老人与马列苏阿达家族
  2. 埃斯达斯。前庭,前庭。
  3. 欧盟的自由也是一样的。乌尔三叶草属植物。毛利
  4. 从利奥开始。奎斯克坐得很好。前庭
  5. 眼镜蛇,调味品,眼镜蛇,眼镜蛇。埃尼昂发酵菌
  6. [结果]去铁剂、红斑狼疮、泪腺矢状体。
  7. 不含蛋鸡的肉鸡。尤特·菲利斯。达皮巴斯广场
  8. 法国、法国、欧洲。[医]埃拉特
  9. 酒鬼。南迪米,锡杀准,蓄积式传送器,利氏器,美特斯

删除第3行、第4行、第5行

  1. 蜂巢式居住者morbi三世老人与马列苏阿达家族
  2. 埃斯达斯。前庭,前庭。
  3. [结果]去铁剂、红斑狼疮、泪腺矢状体。
  4. 不含蛋鸡的肉鸡。尤特·菲利斯。达皮巴斯广场
  5. 法国、法国、欧洲。[医]埃拉特
  6. 酒鬼。南迪米,锡杀准,蓄积式传送器,利氏器,美特斯

我已经做了一个工作方法

代码语言:javascript
复制
 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();
    }

有更简单的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-26 12:35:27

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

代码语言:javascript
复制
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进行类似的操作

代码语言:javascript
复制
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();   
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24430565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档