扫描仪的nextLine(),仅获取部分
所以,使用像这样的东西:
for (int i = 0; i < files.length; i++) {
if (!files[i].isDirectory() && files[i].canRead()) {
try {
Scanner scan = new Scanner(files[i]);
System.out.println("Generating Categories for " + files[i].toPath());
while (scan.hasNextLine()) {
count++;
String line = scan.nextLine();
System.out.println(" ->" + line);
line = line.split("t", 2)[1];
System.out.println("!- " + line);
JsonParser parser = new JsonParser();
JsonObject object = parser.parse(line).getAsJsonObject();
Set<Entry<String, JsonElement>> entrySet = object.entrySet();
exploreSet(entrySet);
}
scan.close();
// System.out.println(keyset);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
当一个人通过Hadoop输出文件时,中间的一个JSON对象正在中断...因为scan.nextLine()在将其分割之前没有获取整行。 即输出是:
->0 {"Flags":"0","transactions":{"totalTransactionAmount":"0","totalQuantitySold":"0"},"listingStatus":"NULL","conditionRollupId":"0","photoDisplayType":"0","title":"NULL","quantityAvailable":"0","viewItemCount":"0","visitCount":"0","itemCountryId":"0","itemAspects":{ ... "sellerSiteId":"0","siteId":"0","pictureUrl":"http://somewhere.com/45/x/AlphaNumeric/$(KGrHqR,!rgF!6n5wJSTBQO-G4k(Ww~~
!- {"Flags":"0","transactions":{"totalTransactionAmount":"0","totalQuantitySold":"0"},"listingStatus":"NULL","conditionRollupId":"0","photoDisplayType":"0","title":"NULL","quantityAvailable":"0","viewItemCount":"0","visitCount":"0","itemCountryId":"0","itemAspects":{ ... "sellerSiteId":"0","siteId":"0","pictureUrl":"http://somewhere.com/45/x/AlphaNumeric/$(KGrHqR,!rgF!6n5wJSTBQO-G4k(Ww~~
大部分上述数据已被清理(不是URL(大部分)),但是......)
并且URL继续如下:$(KGrHqZHJCgFBsO4dC3MBQdC2)Y4Tg ~~ 60_1.JPG?set_id = 8800005007在文件....
所以它略微猛烈。
这也是条目#112,我有其他文件解析没有错误...但这是一个拧我的脑海,主要是因为我没有看到如何scan.nextLine()不工作...
通过调试输出,JSON错误是由于字符串没有正确拆分而导致的。
几乎忘了,如果我试图将违规行放在自己的文件中并解析它,它也可以正常工作。
编辑:也炸毁了,如果我删除在同一地点的违规行。
尝试使用JVM 1.6和1.7
解决方法:BufferedReader scan = new BufferedReader(new FileReader(files [i])); 代替扫描仪....
根据你的代码,我能想到的最好的解释是根据Scanner.nextLine()
使用的标准,行确实在"~~"
之后结束。
行尾标准是:
"rn|[nru2028u2029u0085]"
或 你说文件在"~~"
之后继续,所以让我们把EOF放在一边,看看正则表达式。 这将匹配以下任何一项:
通常的分隔线:
<CR>
<NL>
<CR><NL>
......以及Scanner也认识到的三种不同寻常的线条分隔符。
<NEL>
或“下一行”控制代码 我的理论是,你的输入文件中有一种“不寻常”的形式,并且这不会显示在......你用来检查文件的任何工具。
我建议你使用一个可以显示文件实际字节的工具来检查输入文件; 例如Linux / Unix系统上的od
实用程序。 此外,请检查这不是由某种字符编码不匹配造成的......或者尝试将二进制数据读取或写入为文本。
如果这些没有帮助,那么下一步应该是使用IDE的Java调试器运行应用程序,并通过Scanner.hasNextLine()
和nextLine()
调用单步执行,以找出代码实际正在执行的内容。
几乎忘了,如果我试图将违规行放在自己的文件中并解析它,它也可以正常工作。
那很有意思。 但是如果你用来提取这条线的工具与没有显示(假设的)不同寻常的线分隔符的工具是一样的,那么这个证据是不可靠的。 提取过程可能正在改变导致问题的“东西”。
链接地址: http://www.djcxy.com/p/96059.html