【问题标题】:Removing Array Items from file从文件中删除数组项
【发布时间】:2016-04-28 11:21:44
【问题描述】:

假设我们有一个数组项列表

例如:- a,b,c,d

需要从充满数据的文件中删除,我遗漏了一些东西,任何人都可以帮助我实现这一点,在此先感谢

public static void rmvFromXML(String strFilePath,
        String strTmpFilePath) throws IOException {

    String currentLine = "";
    List<String> list = new ArrayList<String>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");

    BufferedReader reader = new BufferedReader(new FileReader(strFilePath));
    BufferedWriter fileWriter = null;

    fileWriter = new BufferedWriter(new OutputStreamWriter(
            new FileOutputStream(strTmpFilePath)));

    while ((currentLine = reader.readLine()) != null) {

        String trimmedLine = currentLine.trim();
        System.out.println("Trimmed Line    :- " + trimmedLine);

        for (String value : list) {

            System.out.println("Array Value:-   " + value);
            if (trimmedLine.equals(value))

                continue;

            fileWriter.write(trimmedLine + System.getProperty("line.separator"));
        }
    }
    fileWriter.close();
    reader.close();
}

【问题讨论】:

  • 一些注意事项:这样的方法对于单元测试来说是完美的。如果您要进行 TDD;您可能不需要来这里寻求帮助调试您的代码。因为你会以小的增量编写和测试你的代码;而且您最终不会得到“只是不起作用”的大块。然后:为什么要使用列表?如果你把这些东西放到一个集合中......你做一个简单的“set.contains”;因此无需一直迭代您的列表。最后:“列表”是一个坏名字。名称应该说明它们背后的对象意思;不是他们“是”。 (如 valuesToDropFromInput )
  • 您想从一行中删除特定的字符串并且 . bt 你正在用你想要删除的字符串在整行上做一个 equals 。错了吗?

标签: java arrays file


【解决方案1】:

您可以使用正则表达式。这样您就不必迭代并检查 行包含你的字符串

while ((currentLine = reader.readLine()) != null) {
Pattern removeWords = Pattern.compile("\\b(?:a|b|c|d)\\b\\s*", Pattern.CASE_INSENSITIVE);
Matcher fix = removeWords.matcher(currentLine);
String fixedString = fix.replaceAll("");
}

试试上面的方法

input :
abcdefg

output
efg

【讨论】:

    【解决方案2】:

    您需要在文件中的每行中替换提供的子字符串,因此用空格替换它:

    public static void rmvFromXML(String strFilePath,
                                      String strTmpFilePath) throws IOException {
    
            String currentLine = "";
            List<String> list = new ArrayList<>();
            list.add("a");
            list.add("b");
            list.add("c");
            list.add("d");
    
            BufferedReader reader = new BufferedReader(new FileReader(strFilePath));
            BufferedWriter fileWriter = null;
    
            fileWriter = new BufferedWriter(new OutputStreamWriter(
                    new FileOutputStream(strTmpFilePath)));
    
            while ((currentLine = reader.readLine()) != null) {
    
                String trimmedLine = currentLine.trim();
                System.out.println("Trimmed Line    :- " + trimmedLine);
    
                for (String value : list) {
                    System.out.println("Array Value:-   " + value);
                    trimmedLine = trimmedLine.replaceAll(value, "");
                }
    
                fileWriter.write(trimmedLine + System.getProperty("line.separator"));
            }
            fileWriter.close();
            reader.close();
        }
    

    现在输入:

    sdfsdf
    sdfsdf
    sfsdfs
    fa
    a
     b
    c
    asdasdad
       d   
    asdasd
    

    我们得到输出:

    sfsf
    sfsf
    sfsfs
    f
    
    
    
    ss
    
    ss
    

    【讨论】:

    • 它不会删除 a b c 和 d。
    • 工作正常,我有以下行的文件: sdfsdf sdfsdf sfsdfs fa a b c asdasdad d asdasd 当我得到带有以下行的输出文件时: sdfsdf sdfsdf sfsdfs fa asdasdad asdasd 我用完整的代码更新了我的答案我使用并使用和结果文件。
    • 它不会删除单词中的 a b c 和 d
    • 那你的逻辑是完全错误的。你使用线条,而不是文字。你给的,如果它等于任何给定的字符串数组,它会检查完整的字符串。不是子字符串,而是完整的字符串。我将使用删除提供的子字符串的代码更新我的答案。我猜你不会提供一些像“test”这样的字符串,然后每次都删除它?
    • 好吧 op 说他想从文件中删除 a b c 和 d 我只是删除了 b c d 的每一次出现。
    【解决方案3】:

    替换:

        for (String value : list) {
    
            System.out.println("Array Value:-   " + value);
            if (trimmedLine.equals(value))
    
                continue;
    
            fileWriter.write(trimmedLine + System.getProperty("line.separator"));
        }
    

    作者:

        bool found=false:
        for (String value : list) {
    
            System.out.println("Array Value:-   " + value);
            if (trimmedLine.equals(value))
    
                found=true;
        }
        if(!found)
            fileWriter.write(trimmedLine + System.getProperty("line.separator"));
    

    fileWriter.write 调用应该在“for”循环之外。

    【讨论】:

    • a,b,c,d 需要从一个充满数据的文件中删除。你的代码的哪一部分是这样做的。
    • 删除意味着不将它们写入输出文件。最后两行就是这样做的!
    • 没有回答这个问题。他想从文件中删除 a b c 和 d。
    • 不,他没有。你是这样理解的。阅读他的代码。他想生成另一个不包含 a、b、c 和 d 行的文件。我只是将“继续”替换为布尔值,并将“fileWriter.write”调用替换为“for”循环外部。
    • 如果您真的关心“结构”......那么您不会将文件写入部分移出该循环。您将其完全移出方法。没有必要把这两件事结合起来。
    猜你喜欢
    • 1970-01-01
    • 2021-03-20
    • 2021-10-03
    • 2021-10-19
    • 2021-08-14
    • 2014-09-21
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    相关资源
    最近更新 更多