需要创建一个重新排列文件行的文件编辑器
Need to create a file editor that rearranges file lines
我正在尝试构建一个程序来读取文件并重新排列行,使其成为 'correct'。这个文本文件是由第三方创建的,但是行是乱序的,一旦它们是有序的,另一个程序就可以读取它。我不会在编辑文件后创建或使用它。该程序将成为工作流程两端之间的桥梁。目前我的老板是 Java 的忠实粉丝,但我不确定这种编程语言是否最适合我的目标。我还没有为这个项目开始任何认真的编码,但我被认为是 java 的初学者,所以在我疯狂地尝试克服学习曲线之前,我想我会问社区。
我的问题是:对于文件操作(如上所述),Java 是最佳选择吗?
提前致谢!
此处的解决方案取决于您要执行的操作,在没有提供更多信息的情况下,我只能猜测可能是什么。正如 Thomas Bohm 在他的评论中所说,这取决于 "correct" 在这里的含义。我会为一些可能性提供帮助;假设每个示例都使用纯文本文件。
一种可能是每个文件行都带有前缀。考虑这个例子:
Name: John Doe
Phone: (555) 555-5555
Email: jdoe@example.com
假设每个条目的格式应如下所示,每个单独的条目之间有一个空行。在您处理的文件中,每个条目都包含一个姓名、phone 号码和电子邮件,但顺序不一定正确。
在这种情况下,您可能希望创建一个 class(在本例中我们将其命名为 Entry)来存储每个条目中的信息。它的每个实例都应该有三个字符串变量——名称、phone 和电子邮件。然后你会想在你的 main class 中创建一个 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 class 中编写一个 toString()
方法,将 return 一个 Entry 作为字符串以正确的方式格式化,然后在您的 main 中编写一个方法class 遍历 ArrayList 并将每个的内容写入文件。
请记住,这假设文本文件中的每个条目都包含三个必要信息中的每一个,每一个都在单独的连续行中,并且包括每个前缀(正确的拼写和大写)。如果这三行中的任何一行被省略或前缀不正确,输出文件将以不正确的信息结束。
对于第二个可能的示例,考虑与之前相同但每行开头没有前缀的情况,例如:
John Doe
(555) 555-5555
jdoe@example.com
如果是这种情况,我建议您熟悉正则表达式。此代码与前面的代码非常相似,只是条件语句会将整个 String info[i] 与正则表达式相匹配,如下所示:
姓名:^[A-Z][a-z]+ ([A-Z][a-z]* )?[A-Z][a-z]+$
(允许使用名字、可选的中间名或首字母和姓氏,使用适当的大写、空格和标点符号)
Phone:^\(\d{3}\) \d{3}-\d{4}$
(匹配 (555) 555-5555 格式的任何 phone 号码)
Phone:^\(?(\d{3})?\W{0,2}\d{3}-?\d{4}$
(匹配任何 7 位或 10 位数字 phone;括号、间距和连字符可选)
电子邮件:^\w+@\w+\..+$
(匹配任何有效的电子邮件地址)
然后您可以测试字符串是否与给定的正则表达式匹配,如下所示:
info[i].matches("^\w+@\w+\..+$")
如果 info[i]
是一个有效的电子邮件地址,这将是 return true
;否则,false
.
现在,假设您需要您的程序做一些完全不同的事情,例如按字母顺序排列文件中的行。在这种情况下,您可能希望创建一个 ArrayList 并将文件中的每一行作为此 ArrayList 中的字符串存储。然后,您可能希望按字母顺序对该列表进行排序并将排序后的列表写入文件。
我现在没有时间为这个案例编写代码,但如果这是你的目标,我可以稍后帮助你。
我正在尝试构建一个程序来读取文件并重新排列行,使其成为 'correct'。这个文本文件是由第三方创建的,但是行是乱序的,一旦它们是有序的,另一个程序就可以读取它。我不会在编辑文件后创建或使用它。该程序将成为工作流程两端之间的桥梁。目前我的老板是 Java 的忠实粉丝,但我不确定这种编程语言是否最适合我的目标。我还没有为这个项目开始任何认真的编码,但我被认为是 java 的初学者,所以在我疯狂地尝试克服学习曲线之前,我想我会问社区。
我的问题是:对于文件操作(如上所述),Java 是最佳选择吗?
提前致谢!
此处的解决方案取决于您要执行的操作,在没有提供更多信息的情况下,我只能猜测可能是什么。正如 Thomas Bohm 在他的评论中所说,这取决于 "correct" 在这里的含义。我会为一些可能性提供帮助;假设每个示例都使用纯文本文件。
一种可能是每个文件行都带有前缀。考虑这个例子:
Name: John Doe
Phone: (555) 555-5555
Email: jdoe@example.com
假设每个条目的格式应如下所示,每个单独的条目之间有一个空行。在您处理的文件中,每个条目都包含一个姓名、phone 号码和电子邮件,但顺序不一定正确。
在这种情况下,您可能希望创建一个 class(在本例中我们将其命名为 Entry)来存储每个条目中的信息。它的每个实例都应该有三个字符串变量——名称、phone 和电子邮件。然后你会想在你的 main class 中创建一个 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 class 中编写一个 toString()
方法,将 return 一个 Entry 作为字符串以正确的方式格式化,然后在您的 main 中编写一个方法class 遍历 ArrayList 并将每个的内容写入文件。
请记住,这假设文本文件中的每个条目都包含三个必要信息中的每一个,每一个都在单独的连续行中,并且包括每个前缀(正确的拼写和大写)。如果这三行中的任何一行被省略或前缀不正确,输出文件将以不正确的信息结束。
对于第二个可能的示例,考虑与之前相同但每行开头没有前缀的情况,例如:
John Doe
(555) 555-5555
jdoe@example.com
如果是这种情况,我建议您熟悉正则表达式。此代码与前面的代码非常相似,只是条件语句会将整个 String info[i] 与正则表达式相匹配,如下所示:
姓名:^[A-Z][a-z]+ ([A-Z][a-z]* )?[A-Z][a-z]+$
(允许使用名字、可选的中间名或首字母和姓氏,使用适当的大写、空格和标点符号)
Phone:^\(\d{3}\) \d{3}-\d{4}$
(匹配 (555) 555-5555 格式的任何 phone 号码)
Phone:^\(?(\d{3})?\W{0,2}\d{3}-?\d{4}$
(匹配任何 7 位或 10 位数字 phone;括号、间距和连字符可选)
电子邮件:^\w+@\w+\..+$
(匹配任何有效的电子邮件地址)
然后您可以测试字符串是否与给定的正则表达式匹配,如下所示:
info[i].matches("^\w+@\w+\..+$")
如果 info[i]
是一个有效的电子邮件地址,这将是 return true
;否则,false
.
现在,假设您需要您的程序做一些完全不同的事情,例如按字母顺序排列文件中的行。在这种情况下,您可能希望创建一个 ArrayList 并将文件中的每一行作为此 ArrayList 中的字符串存储。然后,您可能希望按字母顺序对该列表进行排序并将排序后的列表写入文件。
我现在没有时间为这个案例编写代码,但如果这是你的目标,我可以稍后帮助你。