Метод поиска строки внутри текстового файла. Затем получение следующих строк до определенного предела

#java #file #methods #project

#java #файл #методы #проект

Вопрос:

Итак, это то, что у меня есть на данный момент :

 public String[] findStudentInfo(String studentNumber) {
                Student student = new Student();
                Scanner scanner = new Scanner("Student.txt");
                // Find the line that contains student Id
                // If not found keep on going through the file
                // If it finds it stop
                // Call parseStudentInfoFromLine get the number of courses
                // Create an array (lines) of size of the number of courses plus one
                // assign the line that the student Id was found to the first index value of the array
                //assign each next line to the following index of the array up to the amount of classes - 1
                // return string array
}
  

Я знаю, как определить, содержит ли файл строку, которую я пытаюсь найти, но я не знаю, как извлечь всю строку, в которой она находится.

Это моя первая публикация, поэтому, если я сделал что-то не так, пожалуйста, дайте мне знать.

Комментарии:

1. Если это домашнее задание, оно должно быть помечено как таковое.

2. Можете ли вы добавить образец входного файла?

Ответ №1:

Вы можете сделать что-то вроде этого:

 File file = new File("Student.txt");

try {
    Scanner scanner = new Scanner(file);

    //now read the file line by line...
    int lineNum = 0;
    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        lineNum  ;
        if(<some condition is met for the line>) { 
            System.out.println("ho hum, i found it on line "  lineNum);
        }
    }
} catch(FileNotFoundException e) { 
    //handle this
}
  

Комментарии:

1. Это не даст мне строку, содержащую строку StudentNumber.

2. Это было полезно. На самом деле не ожидал получить такой быстрый ответ от всех.

3. Обычно в StackOverflow мы благодарим пользователей голосованием или принятием их ответа.

4. @Joel Слева от каждого ответа находится число, окруженное символами вверх / вниз. Эти символы вверх / вниз представляют «голоса» за и против ответа. Ответ с большим количеством голосов «всплывает в начало списка», что облегчает поиск позже. Если вы задали вопрос, рядом с номером также должен быть контур символа «галочка». Щелкните по ней один раз, чтобы указать «правильный» ответ.

5. Не следует ли вам закрыть сканер?

Ответ №2:

Использование API ввода-вывода Apache Commons https://commons.apache.org/proper/commons-io / Я смог установить это с помощью FileUtils.readFileToString(file).contains(stringToFind)

Документация для этой функции находится по адресу https://commons.apache.org/proper/commons-io/javadocs/api-2.4/org/apache/commons/io/FileUtils.html#readFileToString(java.io.File)

Комментарии:

1. Я предполагаю, что это приведет к чтению всего файла в памяти, тогда как решение @Amir этого не сделает?

Ответ №3:

Вот метод java 8 для поиска строки в текстовом файле:

 for (String toFindUrl : urlsToTest) {
        streamService(toFindUrl);
    }

private void streamService(String item) {
        try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
           stream.filter(lines -> lines.contains(item))
                       .forEach(System.out::println);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  

Комментарии:

1. Я получаю эту ошибку The method foreach(System.out::println) is undefined for the type Stream<String>

2. @Nasser Вы установили свой jdk на 1.8? Я думаю, что это вопрос версии java, потому что эта функция работает на java 1.8 и выше.

3. Для этого требуется, чтобы шаблон был найден в той же строке. Это может быть не так, в зависимости от множества факторов.

Ответ №4:

Когда вы читаете файл, рассматривали ли вы возможность чтения его построчно? Это позволило бы вам проверить, содержит ли ваша строка файл, который вы читаете, и затем вы могли бы выполнить любую логику, которая вам нужна, на основе этого?

 Scanner scanner = new Scanner("Student.txt");
String currentLine;

while((currentLine = scanner.readLine()) != null)
{
    if(currentLine.indexOf("Your String"))
    {
         //Perform logic
    }
}
  

Вы могли бы использовать переменную для хранения номера строки, или у вас также могло бы быть логическое значение, указывающее, передали ли вы строку, содержащую вашу строку:

 Scanner scanner = new Scanner("Student.txt");
String currentLine;
int lineNumber = 0;
Boolean passedLine = false;
while((currentLine = scanner.readLine()) != null)
{
    if(currentLine.indexOf("Your String"))
    {
         //Do task
         passedLine = true;
    }
    if(passedLine)
    {
       //Do other task after passing the line.
    }
    lineNumber  ;
}
  

Комментарии:

1. Позвольте мне попробовать это. Я вернусь к вам.

Ответ №5:

Это приведет к нахождению «Mark Sagal» в Student.txt. Предполагая Student.txt содержит

Student.txt

 Amir Amiri
Mark Sagal
Juan Delacruz
  

Main.java

 import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        final String file = "Student.txt";
        String line = null;
        ArrayList<String> fileContents = new ArrayList<>();

        try {
            FileReader fReader = new FileReader(file);
            BufferedReader fileBuff = new BufferedReader(fReader);
            while ((line = fileBuff.readLine()) != null) {
                fileContents.add(line);
            }
            fileBuff.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        System.out.println(fileContents.contains("Mark Sagal"));
    }
}
  

Ответ №6:

Я делаю что-то подобное, но на C . Что вам нужно сделать, это прочитать строки по одной за раз и проанализировать их (перебирать слова одно за другим). У меня есть внешний цикл, который проходит по всем строкам, а внутри него есть другой цикл, который проходит по всем словам. Как только нужное вам слово найдено, просто выйдите из цикла и верните счетчик или что угодно еще.

Это мой код. В основном он анализирует все слова и добавляет их в «индекс». Строка, в которой было слово, затем добавляется в вектор и используется для ссылки на строку (содержит имя файла, всю строку и номер строки) из индексированных слов.

 ifstream txtFile;
txtFile.open(path, ifstream::in);
char line[200];
//if path is valid AND is not already in the list then add it
if(txtFile.is_open() amp;amp; (find(textFilePaths.begin(), textFilePaths.end(), path) == textFilePaths.end())) //the path is valid
{
    //Add the path to the list of file paths
    textFilePaths.push_back(path);
    int lineNumber = 1;
    while(!txtFile.eof())
    {
        txtFile.getline(line, 200);
        Line * ln = new Line(line, path, lineNumber);
        lineNumber  ;
        myList.push_back(ln);
        vector<string> words = lineParser(ln);
        for(unsigned int i = 0; i < words.size(); i  )
        {
            index->addWord(words[i], ln);
        }
    }
    result = true;
}
  

Комментарии:

1. Несмотря на полезность, OP запрашивал решение, основанное на Java. Файловые операции C значительно отличаются от файловых операций в Java, поэтому ваш ответ не совсем полезен в этом контексте.

Ответ №7:

Вот код TextScanner

 public class TextScanner {

        private static void readFile(String fileName) {
            try {
              File file = new File("/opt/pol/data22/ds_data118/0001/0025090290/2014/12/12/0029057983.ds");
              Scanner scanner = new Scanner(file);
              while (scanner.hasNext()) {
                System.out.println(scanner.next());
              }
              scanner.close();
            } catch (FileNotFoundException e) {
              e.printStackTrace();
            }
          }

          public static void main(String[] args) {
            if (args.length != 1) {
              System.err.println("usage: java TextScanner1"
                  "file location");
              System.exit(0);
            }
            readFile(args[0]);
      }
}
  

Он напечатает текст с разделителями