подсчет появления конкретной строки в файле - PullRequest
2 голосов
/ 13 марта 2012

Вот код, над которым я работал:

while ((lineContents = tempFileReader.readLine()) != null)
{
            String lineByLine = lineContents.replaceAll("/\\.", System.getProperty("line.separator")); //for matching /. and replacing it by new line
            changer.write(lineByLine);
            Pattern pattern = Pattern.compile("\\r?\\n"); //Find new line
            Matcher matcher = pattern.matcher(lineByLine);
            while(matcher.find())
            {
                Pattern tagFinder = Pattern.compile("word"); //Finding the word required
                Matcher tagMatcher = tagFinder.matcher(lineByLine);
                while(tagMatcher.find())
                {
                    score++;
                }
                scoreTracker.add(score);
                    score = 0;
            }   
}

Мой пример ввода содержит 6 строк, в которых значения word равны [0,1,0,3,0,0] Поэтому, когда я печатаю scoreTracker (что является ArrayList), я хочу вывод выше. Но вместо этого я получаю [4,4,4,4,4,4], что является общим числом word, но не построчно. Пожалуйста, помогите.

Ответы [ 5 ]

3 голосов
/ 13 марта 2012

lineByLine указывает на все содержимое вашего файла. Вот почему вы получаете [4,4,4,4,4,4]. Вам необходимо сохранить каждую строку в другой переменной line, а затем использовать tagFinder.find(line). Финальный код будет выглядеть так

while ((lineContents = tempFileReader.readLine()) != null)
{
    String lineByLine = lineContents.replaceAll("/\\.", System.getProperty("line.separator")); //for matching /. and replacing it by new line
    changer.write(lineByLine);
    Pattern pattern = Pattern.compile(".*\\r?\\n"); //Find new line
    Matcher matcher = pattern.matcher(lineByLine);
    while(matcher.find())
    {
        Pattern tagFinder = Pattern.compile("word"); //Finding the word required
        //matcher.group() returns the input subsequence matched by the previous match.
        Matcher tagMatcher = tagFinder.matcher(matcher.group());
        while(tagMatcher.find())
        {
            score++;
        }
        scoreTracker.add(score);
            score = 0;
    }   
}
1 голос
/ 13 марта 2012

Исходный код считывал входные данные по одной строке за раз, используя tempFileReader.readLine(), а затем искал конец строк в каждой строке, используя matcher.Поскольку lineContents содержит только одну строку, matcher никогда не находит новую строку, поэтому остальная часть кода пропускается.Зачем вам нужно два разных бита кода, чтобы разбить ввод на строки?Вы можете удалить один из фрагментов кода, связанных с поиском новых строк.Например,

while ((lineContents = tempFileReader.readLine()) != null)
{
      Pattern tagFinder = Pattern.compile("word"); //Finding the word required
      Matcher tagMatcher = tagFinder.matcher(lineContents);
      while(tagMatcher.find())
      {
          score++;
      }
      scoreTracker.add(score);
      score = 0;

}

Я пробовал приведенный выше код, используя файл test.txt в Windows, читаемый BufferedReader.Например,

BufferedReader tempFileReader = new BufferedReader(new FileReader("c:\\test\\test.txt"));

ScoreTracker содержит [0, 1, 0, 3, 0, 0] для файла, содержание которого вы описываете.Я не понимаю, как вы получили [4,4,4,4,4,4] из исходного кода, если в качестве примера ввода используется фактический файл, как описано, а tempFileReader - это BufferedReader.Было бы полезно увидеть код, который вы используете для настройки tempFileReader.

1 голос
/ 13 марта 2012

Это потому, что каждый раз, когда вы ищете одну и ту же строку (lineByLine). Вы, вероятно, намеревались искать каждую строку отдельно. Я предлагаю вам сделать:

    Pattern tagFinder = Pattern.compile("word"); //Finding the word required
    for(String line : lineByLine.split("\\n")
    {
        Matcher tagMatcher = tagFinder.matcher(line);
        while(tagMatcher.find())
            score++;
        scoreTracker.add(score);
        score = 0;
    }
1 голос
/ 13 марта 2012

Может быть, этот код поможет вам:

    String str = "word word\n \n word word\n \n word\n";
    Pattern pattern = Pattern.compile("(.*)\\r?\\n"); //Find new line
    Matcher matcher = pattern.matcher(str);
    while(matcher.find())
    {
        Pattern tagFinder = Pattern.compile("word"); //Finding the word required
        Matcher tagMatcher = tagFinder.matcher(matcher.group());
        int score = 0;
        while(tagMatcher.find())
        {
            score++;
        }
        System.out.print(score + " ");
    }

Вывод 2 0 2 0 1 Он не очень оптимизирован, но ваша проблема заключалась в том, что вы никогда не ограничивали внутреннее сопоставление и всегда сканировали всю строку.

0 голосов
/ 13 марта 2012

Вы можете использовать класс сканера.Вы инициализируете Сканер для строки, которую хотите посчитать, а затем просто подсчитаете, сколько этих токенов найдет Сканер.

И вы можете инициализировать Сканер напрямую с помощью FileInputStream.

Полученный код имеет только 9строки:

File file = new File(fileName);
Scanner scanner = new Scanner(file);
scanner.useDelimiter("your text here");
int occurences;
while(scanner.hasNext()){
     scanner.next();
     occurences++;
}
scanner.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...