2016-04-25 41 views
-2

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

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

在此先感谢!

+3

“正确”在你的语境中意味着什么?你想排序线或什么?你能给个例子吗? 在我看来,如果您想对行进行排序(例如按字母顺序排列或通过行首的索引或其他内容),则可以使用Java轻松完成。 –

+0

*“我的问题是:对于文件操作(如上所述),Java是最好的选择?” - 这是一个意见问题 – MadProgrammer

+0

文件有多大?什么是“正确”的顺序? – radai

回答

0

这里的解决方案取决于你想要做什么,我只能猜测可能没有提供更多信息。正如Thomas Bohm在他的评论中所说的那样,这取决于这里“正确”的含义。我会为一些可能性提供帮助;假设每个示例都使用纯文本文件。

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

Name: John Doe 
Phone: (555) 555-5555 
Email: [email protected] 

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

在这种情况下,您希望创建一个类(让我们在此示例中将其命名为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)); 
} 

然后,您可能要编写中的一个toString()方法以String形式返回Entry的Entry类以正确的方式格式化,然后在主类中编写一个方法来迭代ArrayList,并将每个内容写入文件。请记住,假设文本文件中的每个条目都包含必需的三条信息,每条信息都在单独的连续行上,并且每个前缀都包含在内(使用正确的拼写和大写形式)。如果这三行中的任何一行被忽略或没有正确的前缀,输出文件将以不正确的信息结束。

对于第二个可能的例子,考虑的情况下,和以前一样,但没有在每行开始的前缀,因为这样的:

John Doe 
(555) 555-5555 
[email protected] 

如果是这样的话,我会建议用自己熟悉常用表达。此代码与以前的代码非常相似,只是条件语句将整个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位电话号码;括号,间距和连字可选)

电子邮件:^\[email protected]\w+\..+$(匹配任何有效的电子邮件地址)

然后,您可以测试字符串给定的正则表达式像这样的比赛:

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

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

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

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

+0

感谢您的深度响应。这绝对有帮助!我想我需要去ArrayLists(请参阅之前对原始帖子的评论)来解决我的问题。 '正确'意味着我有一种模式,我希望线条适合,并且没有明显的方式(如字母或数字),我可以重新排列文件。 –

相关问题