web-dev-qa-db-ja.com

テキストファイル内の文字列を検索するメソッド。次に、特定の制限まで次の行を取得します

これが私がこれまでに持っているものです:

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
}

私が見つけようとしている文字列がファイルに含まれているかどうかを見つける方法は知っていますが、その中の行全体を取得する方法はわかりません。

これは初めての投稿なので、何か間違ったことをした場合はお知らせください。

17
Joel Sanchez

次のようなことができます:

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
}
45
Amir Afghani

Apache Commonsの使用IO API 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)

11
MGPJ

テキストファイル内の文字列を検索するJava 8メソッドです。

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

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

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
3
Amir Amiri

ファイルを読んでいるときに、1行ずつ読むことを検討しましたか?これにより、読み取り中に行にファイルが含まれているかどうかを確認でき、それに基づいて必要なロジックを実行できますか?

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++;
}
3
Rion Williams

私は似たようなことをしていますが、C++で行っています。必要なのは、一度に1行ずつ読み取り、それらを解析することです(単語を1つずつ調べます)。すべての行にまたがる外側のループがあり、その中にすべての単語にまたがる別のループがあります。必要なWordが見つかったら、ループを終了して、カウンターまたは必要なものを返します。

これは私のコードです。基本的にすべての単語を解析し、それらを「インデックス」に追加します。次に、Wordが含まれていた行がベクターに追加され、インデックス付きの単語から行(ファイルの名前、行全体、行番号を含む)を参照するために使用されます。

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() && (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;
}
0
Pete

これにより、Student.txtに「Mark Sagal」が見つかります。 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"));
    }
}
0
Mark