我有一个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部分。我做错了什么?有人可以为此建议解决方案吗?
非常感谢。
答案 0 :(得分: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("\"", "");
答案 1 :(得分: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]);
...
}
可以找到完整的文档和示例here
答案 2 :(得分:0)
?
表示“零或一次出现”。您可能希望使用+
代替(一个或多个),以便它可以捕获所有数字,点,冒号等。
答案 3 :(得分:0)
scanner.hasNext(pattern)
如果下一个完整标记与指定模式匹配,则返回true。
但下一个标记是123,"12.5","0.6","15/9/2012
,因为扫描程序使用空格标记单词。
你的正则表达式也存在一些问题
?
表示零或一个,您应该使用*
- 零或更多,或+
- 一个或多个,\\W
,但这也会排除数字。如果您真的想使用扫描仪和正则表达式,请尝试使用
Pattern.compile("(\\d+),\"([^\"]+)\",\"([^\"]+)\",\"([^\"]+)\"");
并使用
将使用的分隔符更改为新的行标记scanner.useDelimiter(System.lineSeparator());
答案 4 :(得分: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
作为数字。如果您愿意,也可以使用\d
。对于空格,您必须使用scanner.useDelimiter("\n")
更改扫描仪的分隔符。
此代码段的输出为:
1st: 123
2nd: 12.5
3rd: 0.6
4th: 15/9/2012 12:11:19