QA@IT

テキストファイルから特定の文を検索して抽出する方法(Java)

10728 PV

はじめまして。ダマダマと申します。
Javaで開発の勉強をしている新前です。
環境は、ノートパッドで.javaコードを書き、コマンドプロンプトから出力する方法で行っています。
最終的にはテキストファイルから特定の検索文字列をコンパイル後のコマンドからユーザーが打ち込んだ名前とIDの部分だけを検索及び抽出するという例を作成するというものです。例えばスペルTを打てばTom Smith 1-866の行が出力できるというものを考えています。

しかし、どうも以下のJava シンボルが見つけられないというエラー15が発生します。

どのようにすればこのエラーを回避できるのか、また、これ以外に効果的な方法がありましたらご教授をお願いいたします。

以下エラーコード全文
.\txtFileReader.java:15: error: cannot find symbol while((line = filescan.readLine()) != null) ^ symbol: method readLine() location: variable filescan of type Scanner 1 error

//Mainコード
import java.util.*;
import java.io.*;

public class Main
{
    public static void main(String[] args) throws IOException
    {
        txtFileReader tfr = new txtFileReader();
        tfr.run();
    }
}
//txtFileReaderコード
import java.util.*;
import java.io.*;

public class txtFileReader
{
    private String words;
    private Scanner typescan, filescan; 

    public void run() throws IOException
    {
        filescan = new BufferedReader(new FileReader("EmpInfo.txt"));
        String line = "";
        words = typescan.nextLine();
        while((line = filescan.readLine()) != null)
        {
            if(line.matches(words))
            {
                System.out.print(line);
                break;
            }
            else
            {
                System.out.print("Sorry, could not find it.");
                break;
            }
        }
    }
}

テキストファイルEmpInfo.txt内には、例えば、以下の社員名(フルネーム)と番号が入っている場合を想定しています。

Tom Smith 1-866
Sandra Williams 2-485
Larry Johnson 3-555
Dorothy-Harris 4-333
Frank Garcia 6-111

よろしくお願いいたします。

更新:
blunder3さんご回答ありがとうございます。
後に誤りを発見し、

if(line.matches(words))

から

 if(line.equals(words))

へ修正したのですが、未だ、

Exception in thread "main" java.lang.NullPointerException
at txtFileReader.run(txtFileReader.java:15)
at Main.main(Main.java:9)
NullPointerExceptionが発生してしまいます。

どの点がほかに問題があるのか、ある場合どのように修正したらよいのか、改めてご教授お願いいたします。

回答

readLineはScannerのメソッドではないためエラーになります。

  • readLine: java.io.BufferedReaderのメソッド
  • nextLine: java.util.Scannerのメソッド

直すには

    private Scanner typescan, filescan; 

のところで型がScannerになっているので、そこをBufferedReaderに変えるか、型のScannerはそのままにして、それに合わせて他を書きかえるか、どっちか好きな方でよいと思います。

追記
NullPointerExceptionが出る件ですが、下の行でtypescan(参照)をnewせずに(実体なしに)いきなり使っているので、そのせいではないでしょうか。

        words = typescan.nextLine();

damadamadamaさんのコードを元にしてこっちでテストしたときのものを参考までに掲載しておきます。意図がよくわからなかったものは単に削除しています。深く考えるのが面倒だったので、wordsはとりあえずコンストラクタで初期化しています。whileループの中のelse節は、それがあると最初の行がマッチしなかったとき、すぐループを抜けてしまうので削除しました。matchesがequalsの間違いだったというのは、このテストを作ったときには知らなかったので、そのままです:-)

//Mainコード
import java.util.*;
import java.io.*;

public class Main
{
    public static void main(String[] args) throws IOException
    {
        txtFileReader tfr = new txtFileReader("T.*");
        tfr.run();
    }
}
//txtFileReaderコード - Scanner version
import java.util.*;
import java.io.*;

public class txtFileReader
{
    private String words;
    private Scanner filescan;

    public txtFileReader(String words)
    {
        this.words = words;
    }

    public void run() throws IOException
    {
        filescan = new Scanner(new File("EmpInfo.txt"));

        while (filescan.hasNextLine())
        {
           String line = filescan.nextLine();
           if (line.matches(words))
           {
               System.out.println(line);
               // break;
           }
        }
    }
}
//txtFileReaderコード - BufferedReader version
import java.util.*;
import java.io.*;

public class txtFileReader
{
    private String words;
    private BufferedReader filescan;

    public txtFileReader(String words)
    {
        this.words = words;
    }

    public void run() throws IOException
    {
        filescan = new BufferedReader(new FileReader("EmpInfo.txt"));

        String line;
        while ((line = filescan.readLine()) != null)
        {
            if (line.matches(words))
            {
                System.out.println(line);
                // break;
            }
        }
    }
}

編集 履歴 (3)
  • 追加の質問があったので回答を追記しました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。