Анализ большого файла с использованием сопоставления с образцом, но, похоже, он не соответствует каждому случаю, показанному в тексте.

Я пытаюсь проанализировать большой файл, который очень структурирован, и извлечь только ту информацию, с которой я хочу работать, представленную тегом в начале строки. Размер элементов, которые я вытащил, был недостаточно большим, и кажется, что некоторые элементы пропускаются, но я не могу понять, почему. Данные форматируются следующим образом:

Идентификатор: 1
ASIN: 0827229534
title: Patterns of Preaching: A Sermon Sampler
группа: Book
salesrank: 396585
аналогичный: 5 0804215715 156101074X 0687023955 0687074231 082721619X
категории: 2
|Книги[283155]|Темы[1000]|Религия и духовность[22]|Христианство[12290]|Духовенство[12360]|Проповедь[12368] |Книги[283155]|Темы[1000]|Религия и духовность[ 22]|Христианство[12290]|Духовность[12360]|Проповеди[12370] отзывов: всего: 2 скачано: 2 средний рейтинг: 5 2000-7-28 пользователь: A2JW67OY8U6HHK рейтинг: 5 голосов: 10 полезно: 9 2003-12- 14 покупателей: A2VE83MZF98ITY рейтинг: 5 голосов: 6 полезно: 5

Для каждого элемента указана каждая категория, даже если в этой категории нет элементов (например, похожих: 0). Существует более 500 000 идентификационных номеров, однако при совпадении шаблона для поиска идентификатора сообщается только около 58 000. Я просто ищу строку с "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 в текстовом файле меньшего размера, взятом из приведенной выше ссылки, но неверно в исходном файле.


person user3578739    schedule 27.04.2014    source источник
comment
Из-за ведущего .* ваш шаблон может соответствовать идентификатору в середине строки. Это то, что вы хотите?   -  person 1.618    schedule 27.04.2014
comment
На самом деле нет, я бы этого не хотел. Идентификатор должен быть в начале строки каждый раз, поэтому Id.* более правильный, спасибо, я отредактирую это. Тем не менее, это все равно должно только увеличить количество вхождений, так что я запутался @ 1.618   -  person user3578739    schedule 27.04.2014
comment
В этом случае ваш шаблон должен быть ^Id:. ^ соответствует началу строки. Я попробовал grep -G -c "^Id:" amazon-meta.txt, который вернул 548552, и это именно то, что он говорит, что общее количество находится в строке 2 файла. Похоже, проблема связана с java.util.regex.*, который я раньше не использовал.   -  person 1.618    schedule 27.04.2014


Ответы (1)


На самом деле это вообще не проблема сопоставления с образцом. Сопоставление с образцом работает, как и должно быть, однако сканер имеет недостатки. Или, по крайней мере, запись текстового файла, я нашел один случай, когда произошло то же самое, ответы на проблему можно найти здесь: Сканер Java не просматривает весь файл

person user3578739    schedule 28.04.2014