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

时间:2016-04-25 21:54:30

标签: java data-manipulation

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

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

提前致谢!

1 个答案:

答案 0 :(得分:0)

这里的解决方案取决于您尝试做什么,而我只能在没有提供更多信息的情况下猜测可能会发生什么。正如Thomas Bohm在评论中所说,这取决于"纠正"在这里意味着我会为一些可能性提供帮助;假设每个例子都使用明文文件。

一种可能性是每个文件行都带有前缀。考虑这个例子:

Name: John Doe
Phone: (555) 555-5555
Email: jdoe@example.com

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

在这种情况下,您可能希望创建一个类(在此示例中将其命名为Entry)以将信息存储在每个条目中。它的每个实例都应该有三个String变量 - 名称,电话和电子邮件。然后,您需要在主类中创建一个ArrayList并创建每个条目(请注意,sc是一个读取.txt文件的Scanner):

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()方法,该方法将以正确方式格式化String作为String,然后在主类中编写一个方法来迭代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+\..+$(匹配任何有效的电子邮件地址)

然后,您可以测试String是否匹配给定的正则表达式,如:

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

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

现在,让我们说你需要你的程序做一些完全不同的事情,例如按字母顺序排列文件中的行。在这种情况下,您可能希望创建一个ArrayList并将该文件中的每一行存储为此ArrayList中的String。然后,您需要按字母顺序对此列表进行排序,并将已排序的列表写入文件。

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