【问题标题】:How to validate the contents of text file?如何验证文本文件的内容?
【发布时间】:2014-11-02 19:02:09
【问题描述】:

我需要一些关于必须读取指定文本文件然后验证其内容的程序的帮助。每个有效匹配的结果应按以下格式输出到控制台(stdout):

HomeTeamName [HomeTeamScore] | AwayTeamName [AwayTeamScore]

在输出的最后,我需要生成统计信息,显示已处理的有效和无效匹配的总数。我还需要它来显示总进球数。

我目前的代码是:

public class Generator {

public static void main(String[] args) throws FileNotFoundException {


    Scanner s = new Scanner(new File("results.txt"));   

    String line;

    while ( s.hasNext() ) {
        line = s.nextLine();    
        System.out.println(line);

    }

    System.out.println("\nEOF");    // Output and End Of File message.

}

}

示例输入文件为:

阿斯顿维拉:米德尔斯堡:3:1
切尔西 : 曼城 : 1 // 仅提供 3 个字段
托特纳姆热刺队 : 斯托克城 : 0 : 0
Hull :: 2 : 3 // 缺少客场球队名称
西汉姆联队 : 维冈竞技 : 2 : 1
:: 2 : 0 // 两个队名都不见了
富勒姆 : 利物浦 : 1 : 2
利物浦阿森纳 : 2 : 2 // 球队之间缺少分隔符 (:)
桑德兰 : 纽卡斯尔联 : 0 : 4
Hull : Liverpool : 5 : x // 给出“x”而不是客队得分

【问题讨论】:

  • 您可以添加您尝试验证的示例输入文件吗?
  • 您好,感谢您的快速回复,我现在添加了包含有效和无效内容的示例输入文件,我真的坚持这个,因为我还是 JAVA 编程的新手 :)

标签: java validation count stdout


【解决方案1】:

使用 java.util.regex.Pattern 似乎很容易。只需为有效的记录格式构建一个正则表达式模式。然后为您阅读的每一行创建一个匹配器,看看它是否匹配。如果是,则输出该行。

类似(伪java代码):

Pattern pattern = Pattern.compile("your regular expression here");
while((line = readLine()) != null) {
   Matcher m = pattern.matcher(line);
   if (m.matches()) {
      System.out.println(line + " is good");
   } else {
      System.out.println(line + " is not good");
   } 
}

不带正则表达式的选项:

while((line = readLine()) != null) {
   String[] values = line.split(":");
   if (values.length != 4) {
       System.out.println("bad line: " + line);
   }
   // check for empty fields like:
   if (values[0].isEmpty()) {/* error message */}
   // check for proper numeric values like:
   try {
       // prob need to remove leading whitespace as well...
       Integer.parseInt(values[2].trim());
   } catch (NumberFormatException e) {/* error message */}
   // etc...
}

鉴于上述两者之间的选择,我会使用表达式。它比通过一堆 if/else 代码更具表现力。还有像 BeanIO 这样的库可以为你做很多这样的事情。

【讨论】:

  • 我相信使用这样的代码可能会很容易,但是是否有可能通过拆分行然后使用 if 语句来做同样的事情?因为这就是我必须做的,但我真的不知道怎么做,谢谢你的回复:)
  • 分割线也很容易,只是不够干净。
猜你喜欢
  • 2023-03-18
  • 2018-12-04
  • 2013-01-09
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-19
相关资源
最近更新 更多