0

我正在做一个读取日期并显示日期范围和无效日期的日期程序。首先,我一次读一行,并按照我希望的方式格式化该行。但是,我还想将我读入的字符串行中的月、日和年放入我可以使用的单独变量中。我读到的数据如下:

    June 17, 1997
    July 23, 1997
    September 28, 1980
    September 31, 1980
    Mar. 2, 1980
    Apr. 2, 1980
    May 3, 1980
    Nov 25, 1989
    Dec 25, 1989
    Jan 3, 1973

到目前为止我的代码片段看起来像

  Scanner in = null;
    try {
        in = new Scanner(new File("dates.txt"));
    } catch (FileNotFoundException exception) {
        System.err.println("failed to open dates.txt");
        System.exit(1);
    }
    while (in.hasNextLine()) {
        String line = in.nextLine();
        line = line.replace(".", "");
        line = line.replace(",", "");
    }

所以我的问题是,我如何“扫描”我的行变量并将其分成不同的标记/月、日、年变量。或者我可以最初扫描字符串标记,而不是扫描整行,然后将它们改造成我想要的(去掉逗号和句点),然后将它们解析为整数?如果可能的话,将其解析为 int 的操作是什么?

4

2 回答 2

1

你可以使用这样的东西..

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
import java.util.StringTokenizer;

public class ParseFileName {
  public static void main(String[] args) throws IOException {
    Scanner in = null;
    try {
      in = new Scanner(new File("dates.txt"));
    } catch (FileNotFoundException exception) {
      System.err.println("failed to open dates.txt");
      System.exit(1);
    }
    while (in.hasNextLine()) {
      String line = in.nextLine();
      line = line.replace(".", "");
      line = line.replace(",", "");

      StringTokenizer st = new StringTokenizer(line);
      String strMonth = st.nextToken();
      String strDay = st.nextToken();
      String strYear = st.nextToken();

      Integer day = Integer.parseInt(strDay);
      Integer year = Integer.parseInt(strYear);
      //...
    }
  }

}

现在,您需要确保您的行总是这样,否则 nextToken 将需要验证.. 就像使用 hasMoreTokens 方法一样。如果需要获取数月的整数,也可以编写映射方法。

于 2013-09-23T22:34:56.843 回答
1

给猫剥皮的方法不止一种:

你可以使用正则表达式

String[] strings = new String[3];

Pattern p = Pattern.compile("(\\w+) (\\d+), (\\d+)");
Matcher m = p.matcher(inputString);
if(m.matches()) {
   for(int i=0;i<3;i++) {
      strings[i] = m.group(i+1);
   }
}

最方便的工具是这里的 Java 在线正则表达式检查器

您可以采用不同的方法:您可以尝试使用Scanner的适当方法逐个读取字段,而不是读取整行,然后将它们分成字段:

公共字符串下一个()

从此扫描器中查找并返回下一个完整的令牌。一个完整的标记前后是匹配分隔符模式的输入。此方法可能会在等待输入扫描时阻塞,即使先前调用 hasNext() 返回 true。

public int nextInt(int radix)

将输入的下一个标记扫描为 int。如果下一个标记无法转换为有效的 int 值,则此方法将抛出 InputMismatchException,如下所述。如果翻译成功,扫描仪会超过匹配的输入。如果下一个标记与上面定义的整数正则表达式匹配,则将标记转换为 int 值,就像通过删除所有区域设置特定前缀、组分隔符和区域设置特定后缀,然后通过 Character.digit 将非 ASCII 数字映射到 ASCII 数字, 如果存在特定于语言环境的负前缀和后缀,则在前面加上负号 (-),并将结果字符串传递给具有指定基数的 Integer.parseInt。

或者,您可以使用SimpleDateFormat来处理您拥有的不同格式

SimpleDateFormat format1 = new SimpleDateFormat("MMMMM d, yyyy");
SimpleDateFormat format2 = new SimpleDateFormat("MMM. d, yyyy");
于 2013-09-23T22:36:41.580 回答