【问题标题】:Java compare strings from two places and exclude any matchesJava比较来自两个地方的字符串并排除任何匹配项
【发布时间】:2017-09-25 05:14:30
【问题描述】:

我试图得到一个 results.txt 减去任何匹配项,成功地将一些字符串输入与另一个 .txt 文件进行了比较。盯着这段代码太久了,我不知道为什么它不起作用。编码新手,如果我能朝着正确的方向前进,我将不胜感激!也许我需要一种不同的方法?对于您可能发出的任何响亮的嘟嘟声,请提前道歉。使用 Java8。

//Sending a String[] into 'searchFile', contains around 8 small strings.
//Example of input: String[]{"name1","name2","name 3", "name 4.zip"}
                              ^ This is my exclusions list.

    public static void searchFile(String[] arr, String separator)
    {
        StringBuilder b = new StringBuilder();
        for(int i = 0; i < arr.length; i++)
        {
            if(i != 0) b.append(separator);
            b.append(arr[i]);
            String findME = arr[i];
            searchInfo(MyApp.getOptionsDir()+File.separator+"file-to-search.txt",findME);
        }
    }

^这很好用。然后我将结果发送到“searchInfo”并尝试匹配和删除任何重复的(完整的,而不是部分的)字符串。这是我目前失败的地方。代码运行但没有产生我想要的输出。它经常找到部分字符串而不是完整的字符串。我认为'results.txt'文件每次都被覆盖......但我不确定!

file-to-search.txt 包含:"name2","name.zip","name 3.zip","name 4.zip"(文本文件只有一行)

public static String searchInfo(String fileName, String findME)
{
    StringBuffer sb = new StringBuffer();
    try {
        BufferedReader br = new BufferedReader(new FileReader(fileName));

        String line = null;
        while((line = br.readLine()) != null)
        {
            if(line.startsWith("\""+findME+"\""))
                 {
                    sb.append(line);
                        //tried various replace options with no joy
                        line = line.replaceFirst(findME+"?,", "");

                        //then goes off with results to create a txt file
                        FileHandling.createFile("results.txt",line);
                }
        }
    } catch (Exception e) {
        e.printStackTrace();        
    }
    return sb.toString();
}

我最终想要的是一个结果文件减去任何匹配的完整字符串(不是部分字符串):

例如results.txt 以:"name.zip","name 3.zip"

结尾

【问题讨论】:

  • 什么是FileHandling?
  • FileHandling.createFile 只是根据两个输入(文件名和内容)为我创建一个文本文件。
  • 我是否正确假设您有一个每行都有一个字符串的文件。您需要一个向其提供文件的函数和一个字符串。您想创建一个新文件,其中如果您已经拥有的文件中的任何行与您提供的字符串匹配,则它不应该是新文件的一部分。因此,如果您有一个包含 123 456 756 的文件并且您提供了 456 作为字符串,您想要一个包含 123 756 的新文件,请假设空格作为换行符,因为它们在评论中没有正确显示:)
  • @masadwin。嗨,文件只有一行,有多个字符串,例如“123”、“456”、756”。或者换句话说,当我在文本编辑器中打开文件时,只显示一行。结果文件字符串也需要在一行上,因为它将是由仅读取第 1 行的第 3 方程序读取。谢谢。

标签: java replace while-loop bufferedreader stringbuffer


【解决方案1】:

我所掌握的信息还可以。你能做的就是这个

List<String> result = new ArrayList<>();
String content = FileUtils.readFileToString(file, "UTF-8");
for (String s : content.split(", ")) {
    if (!s.equals(findME)) { // assuming both have string quotes added already
        result.add(s);
    }
}
FileUtils.write(newFile, String.join(", ", result), "UTF-8");

使用 apache commons file utils 方便。您可以根据需要在逗号后添加或删除空格。

【讨论】:

  • 谢谢。尝试这个,它目前想出了: FileUtils 类型中的方法 readFileToString(File, String) 不适用于参数 (String, String)。
  • 您想将File 对象作为第一个参数而不是字符串传递。您使用的是哪个 IDE?您应该得到有关方法可以接受哪些参数的提示。您在 File 构造函数中传递字符串。喜欢new java.io.File("pathToFile")
  • 我在 Windows 上使用 Eclipse (Mars)。消息已移至:默认构造函数无法处理隐式超级构造函数抛出的异常类型 IOException。必须定义显式构造函数。我会继续寻找。关于我上面的代码,我的假设是否正确,我当前的结果文件每次都可能被覆盖,你知道吗?
  • 您是否尝试在您的FileHandling 构造函数中写入new File()?。输出文件取决于您在最后一行中传入的newFile。如果您继续提供相同的路径,那么是的,它将覆盖
  • 谢谢,我之前在文件名中添加了一个随机字符生成器,​​并看到了 4 个新文件,每个循环一个。只想要一个文件哈哈。感谢您迄今为止的帮助!
猜你喜欢
  • 2012-08-29
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
相关资源
最近更新 更多