需要创建一个重新排列文件行的文件编辑器



我正在尝试构建一个程序来读取文件并重新排列行,使其"正确"。此文本文件由第三方创建,但行顺序不正确,一旦它们按顺序排列,另一个程序就可以读取它。我没有创建文件或在编辑文件后使用它。该程序将成为工作流程两端之间的桥梁。目前,我的老板是Java的忠实粉丝,但我不确定这种编程语言是否最适合目标。我还没有开始为这个冒险进行任何认真的编码,但我被认为是 java 的初学者,所以在我疯狂地试图克服学习曲线之前,我想我会问问社区。

我的问题是:对于文件操作(如上所述),Java是最佳选择吗?

提前感谢!

这里的解决方案取决于您要做什么,如果没有提供更多信息,我只能猜测这可能是什么。正如托马斯·博姆(Thomas Bohm)在他的评论中所说,这取决于这里的"正确"是什么意思。我会为一些可能性提供帮助;假设每个示例都使用纯文本文件。

一种可能性是每个文件行都以某些内容为前缀。请考虑以下示例:

Name: John Doe
Phone: (555) 555-5555
Email: jdoe@example.com
假设每个条目

的格式应该像这样,每个单独的条目之间都有一个空行。在您正在处理的文件中,每个条目都包含姓名、电话号码和电子邮件,但顺序不一定正确。

在这种情况下,您可能希望创建一个类(在本例中将其命名为 Entry)来存储每个条目中的信息。它的每个实例都应该有三个字符串变量 - 姓名、电话和电子邮件。然后,您需要在主类中创建一个 ArrayList,并按原样创建每个条目(请注意,sc 是读取.txt文件的扫描程序):

ArrayList<Entry> entries = new ArrayList<>();
String[] info = new String[3];
String name;
String phone;
String email;
while (sc.hasNextLine()) {
    do {
        info[0] = sc.nextLine();
    } while (!sc.nextLine().isEmpty());
    // this ensures that empty lines will not be treated as if they contained information
    info[1] = sc.nextLine();
    info[2] = sc.nextLine();
    // all three lines in the entry have now been assigned to Strings
    for (int i=0; i<3; i++) {
        if (info[i].startsWith("Name") {
            name = info[i];
        } else if (info[i].startsWith("Phone") {
            phone = info[i];
        } else if (info[i].startsWith("Email") {
            email = info[i];
        }
    }
    entries.add(new Entry(name, phone, email));
}

然后,您可能希望在 Entry 类中编写一个 toString() 方法,该方法将以正确方式格式化的字符串形式返回 Entry,然后在主类中编写一个方法来循环访问 ArrayList 并将每个方法的内容写入文件。

请记住,这假定文本文件中的每个条目都包含三个必要的信息中的每一个,每个信息都在单独的连续行上,并且包含每个前缀(具有正确的拼写和大小写)。如果省略这三行中的任何一行或前缀不正确,则输出文件最终会得到不正确的信息。

对于第二个可能的示例,请考虑与以前相同但每行开头没有前缀的情况,如下所示:

John Doe
(555) 555-5555
jdoe@example.com

如果是这种情况,我建议您熟悉正则表达式。此代码与前面的代码非常相似,不同之处在于条件语句会将整个 String info[i] 与正则表达式匹配

,如下所示:

名称:^[A-Z][a-z]+ ([A-Z][a-z]* )?[A-Z][a-z]+$(允许使用名字、可选的中间名或首字母以及姓氏,具有适当的大写、空格且无标点符号)

电话:^(d{3}) d{3}-d{4}$(匹配 (555) 555-5555 格式的任何电话号码)

电话:^(?(d{3})?W{0,2}d{3}-?d{4}$(匹配任何 7 位或 10 位电话号码;括号、空格和连字可选)

电子邮件:^w+@w+..+$(匹配任何有效的电子邮件地址)

然后,您可以测试字符串是否与给定的正则表达式匹配,如下所示:

info[i].matches("^w+@w+..+$")

如果info[i]是有效的电子邮件地址,这将返回true;否则,false

现在,假设您需要程序执行完全不同的操作,例如按字母顺序排列文件中的行。在这种情况下,您可能希望创建一个 ArrayList,并将文件中的每一行存储为此 ArrayList 中的字符串。然后,您需要按字母顺序对此列表进行排序,并将排序后的列表写入文件。

我现在没有时间为这种情况编写代码,但如果这是您在这里的目标,我可以稍后帮助您。

最新更新