0

我有一个具有以下数据格式的 csv 文件

123,"12.5","0.6","15/9/2012 12:11:19"

这些数字是:

  • 订单号
  • 价格
  • 折扣率
  • 销售日期和时间

我想从行中提取这些数据。

我试过正则表达式:

String line = "123,\"12.5\",\"0.6\",\"15/9/2012 12:11:19\"";
Pattern pattern = Pattern.compile("(\\W?),\"([\\d\\.\\-]?)\",\"([\\d\\.\\-]?)\",\"([\\W\\-\\:]?)\"");
Scanner scanner = new Scanner(line);
if(scanner.hasNext(pattern)) {
    ...
}else{
    // Alaways goes to here
}

看起来我的模式不正确,因为它总是转到 else 部分。我做错了什么?有人可以为此提出解决方案吗?

非常感谢。

4

5 回答 5

1

具体拆分似乎有点过于复杂,您应该尝试通过元素之间最明显的常用分隔符进行拆分,即逗号。也许你应该尝试这样的事情:

    final String info = "123,\"12.5\",\"0.6\",\"15/9/2012 12:11:19\"";
    final String[] split = info.split(",");
    final int orderNumber = Integer.parseInt(split[0]);
    final double price = Double.parseDouble(split[1].replace("\"", ""));
    final double discountRate = Double.parseDouble(split[2].replace("\"", ""));
    final String date = split[3].replace("\"", "");
于 2013-09-08T13:55:18.310 回答
1

正则表达式对于这类工作来说非常繁琐。

我建议改用 CSV 库,例如OpenCSV

该库可以将String条目解析为String数组,并且可以根据需要解析各个条目。这是针对特定问题的 OpenCSV 示例:

CSVReader reader = new CSVReader(new FileReader("yourfile.csv"));
String [] nextLine;
while ((nextLine = reader.readNext()) != null) {
   int orderNumber = Integer.parseInt(nextLine[0]);
   double price = Double.parseDouble(nextLine[1]);
   double discountRate = Double.parseDouble(nextLine[2]);
   ...
}

完整的文档和示例可以在这里找到

于 2013-09-08T14:07:21.133 回答
0

scanner.hasNext(pattern)

文档

如果下一个完整的标记与指定的模式匹配,则返回 true。

但下一个标记是123,"12.5","0.6","15/9/2012因为扫描仪使用空格标记单词。

您的正则表达式也有一些问题

  • 你使用?的意思是零或一,你应该使用*- 零或更多,或+- 一个或更多,
  • \\W在开始时使用过,但这也将排除数字。

如果您真的想使用扫描仪和正则表达式,请尝试使用

Pattern.compile("(\\d+),\"([^\"]+)\",\"([^\"]+)\",\"([^\"]+)\"");

并将使用的分隔符更改为新行标记

scanner.useDelimiter(System.lineSeparator());
于 2013-09-08T14:08:27.893 回答
0

这是针对您的情况的可能解决方案:

    String line = "123,\"12.5\",\"0.6\",\"15/9/2012 12:11:19\"";
    Pattern pattern = Pattern.compile("([0-9]+),\\\"([0-9.]+)\\\",\\\"([0-9.]+)\\\",\\\"([0-9/:\\s]+)\\\"");
    Scanner scanner = new Scanner(line);
    scanner.useDelimiter("\n");
    if(scanner.hasNext(pattern)) {
        MatchResult result = scanner.match();
        System.out.println("1st: " + result.group(1));
        System.out.println("2nd: " + result.group(2));
        System.out.println("3rd: " + result.group(3));
        System.out.println("4th: " + result.group(4));
    }else{
        System.out.println("There");
    }

请注意,这?意味着 0 或 1 次出现,同时+意味着 1 次或更多。

0-9注意for 数字的使用。\d如果你喜欢,你也可以使用。例如,对于空格,您必须使用 更改扫描仪的分隔符scanner.useDelimiter("\n")

此代码段的输出是:

1st: 123
2nd: 12.5
3rd: 0.6
4th: 15/9/2012 12:11:19
于 2013-09-08T14:16:42.143 回答
0

?在正则表达式中的意思是“零次或一次出现”。您可能想+改用(一个或多个),以便它可以捕获所有数字、点、冒号等。

于 2013-09-08T14:01:58.657 回答