我试图解析一个非常结构化的大文件,并提取出我想要处理的信息,如行首的标记所示。我取出的物品尺寸不够大,似乎有些物品被跳过了,但我不知道为什么。数据格式如下:
Id:1
ASIN:0827229534
title:传道的模式:一个Sermon采样器
组:图书
销售额排名:396585
类似:5 0804215715 156101074X 0687023955 0687074231 082721619X
类别:2
|书籍【283155】|主题【1000】|宗教与宗教;灵性[22]|基督教[12290]|神职人员[12360]|传道[12368]|书籍【283155】|主题【1000】|宗教与宗教;灵性[22]|基督教[12290]|神职人员[12360]|讲道[12370]评论:总数:2下载:2平均评分:52000-7-28剪切者:A2JW67OY8U6HHK评分:5票:10个有帮助:92003-12-14裁剪者:A2VE83MZF98ITY评分:5票:6有帮助:5
每个项目都列出了每个类别,即使该类别中没有项目(例如类似的:0)有超过500000个Id号,但当我匹配模式以查找Id时,只报告了大约58000个Id号。我只是简单地查找一个带有"Id"的行,然后递增一个和。下面是简单的代码。
import java.util.*;
import java.io.*;
import java.util.regex.*;
public class metaData4{
public static void main(String[] args) throws Exception{
File a = new File(args[0]);
Scanner doc = new Scanner(a);
String pattern = "Id.*";
int sum = 0;
while (doc.hasNextLine()){
String data = doc.nextLine();
if (data.matches(pattern) ){
sum++;
}
}
System.out.println(sum);
}
}
指向我正在使用的数据的链接(警告:这是一个大的文本文件!)http://snap.stanford.edu/data/bigdata/amazon/amazon-meta.txt.gz
编辑:为了让问题更清楚,我正在制作一个hasmap,其中键为ASIN,值为"相似"列表。ASIN和Id显示的次数相同,我使用Id作为模式匹配的行,因为出现的次数由以下数字清楚地指示。运行前面的代码会在从上面的链接获取的较小文本文件上返回正确的Id出现次数,但在原始文件上不正确。
这实际上根本不是模式匹配的问题。模式匹配按预期工作,但扫描仪存在缺陷。或者至少在编写文本文件时,我发现了一个发生同样事情的情况,问题的答案可以在这里找到:Java扫描仪没有遍历整个文件