【问题标题】:How to find lines in a text file containing specific strings and replace each whole line with a new string,?如何在包含特定字符串的文本文件中查找行并用新字符串替换每一行?
【发布时间】:2021-02-25 10:29:28
【问题描述】:

刚开始在 Android 上使用 Java。 查找大量示例代码来搜索字符串并替换它们或删除它们出现的行。

但是没有什么可以用新字符串替换字符串所在的整行。

如果有示例,我将不胜感激提供指向它的指针或一些我可以修改的示例代码。

文件不超过 50 行。

总是会搜索两个字符串,每个出现的行总是会被一个全新的字符串替换。

每个字符串在文件中只会出现一次(尽管可能有一些类似的)。

行号未知(与该行其余部分的文本一样)。

新行必须插入文本文件中与原始行完全相同的行号。

文本文件命名示例:xyz-colors.txt

搜索字符串一:yellow-XXc

用于替换出现字符串 1 的完整行的新字符串:John - black-XXe - new pin 13762

搜索字符串二:green-BBa

用于替换出现字符串 2 的完整行的新字符串:Mike - red-XXd - new pin 14862

感谢您的任何指点。

编辑:

我几乎已经放弃了。这么多例子,但都发现字符串多次出现,这将浪费资源和时间,因为我确定只有一次出现。我只会要求他们重组他们的文件,所以我现在需要替换的行号,然后从那里开始。

编辑2: 这些文件无法重组,所以我必须找到 Paths.get 的替代方法

编辑3: 我刚刚解决了这个问题。 使用 Scanner 获取行号,使用 BufferedReader 和 FileReader/readline 获取该行号的完整字符串。现在我只需要用包含使用 FileWriter 所做更改的另一个字符串替换整行中的字符串。完成后我会发布完整的代码。

【问题讨论】:

    标签: java android string replace


    【解决方案1】:

    让我们这样处理:

    • 你有一个文件要读取 --> 先弄清楚如何加载它

    • 你必须更新一个文件 --> 弄清楚如何更新一个文件。

    • 读取所有行(因为它最多 50 行,这里不应该关心优化)

    • 循环遍历每一行,检查它是否包含您要搜索的字符串,将 Line 替换为 new Line。

    • 循环结束了吗?使用更新的行列表更新您的文件。

    研究使用 Java 中的 File.readAllLines() >= 8

    一些有用的文档:https://javarevisited.blogspot.com/2015/07/3-ways-to-read-file-line-by-line-in.html#axzz6dg6HEon1

    【讨论】:

    • 谢谢你,苏珊。我正在努力遵循这一点。我现在可以使用扫描仪毫无问题地读取文件,现在正在进入下一部分。
    【解决方案2】:

    只是一个简单的例子作为起点,没有异常处理:

    import java.io.IOException;
    import java.nio.charset.Charset;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.List;
    
    public class Test {
        public static void main(String[] args) throws IOException {
            //path to your file
            String filename ="C:\\Temp\\xyz-colors.txt";
            //read content of file to list
            List<String> list = Files.readAllLines(Paths.get(filename));
    
            String searchOne = "yellow-XXc";
            String replacementOne = "John - black-XXe - new pin 13762";
    
            String searchTwo = "green-BBa";
            String replacementTwo = "Mike - red-XXd - new pin 14862";
    
            list.replaceAll(s -> s.contains(searchOne) ? replacementOne : s);
            list.replaceAll(s -> s.contains(searchTwo) ? replacementTwo : s);
    
            //write modified list to file
            Files.write(Paths.get(filename), list, Charset.forName("UTF-8"));
        }
    
    }
    

    【讨论】:

    • 谢谢。所以我调用了该方法,它希望我传递一个参数,但我看不到它期望传递的内容。如果我删除 String[] 参数并以这种方式调用该方法,那么它将带我回到我的应用程序的登录屏幕。在调试中,它正确显示了 List 的文件路径。但随后没有进一步(崩溃到我的登录屏幕)。我想是因为我删除了论点。如何正确调用该方法(我需要传递的参数是什么)?谢谢
    • @Anabelle2020 他只是在向您展示 main 方法中的示例代码。 main 方法是 Java 的入口点,你不应该触摸它的签名/参数。你应该创建一个类
    • 谢谢苏珊。我现在已经创建了新的类和方法。它仍然把我扔到我的登录屏幕上。这可能是因为我在 Android 上运行它吗?
    • 我已经尝试过其他类似的示例,而 Paths.get 就是问题所在。每当运行它时,它都会导致我的应用程序返回登录屏幕。然而,当与 Scanner(filename) 或 new File() 一起使用时,相同的路径可以正常工作,因此实际路径很好,只是没有 Paths.get!
    猜你喜欢
    • 2017-06-16
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多