web-dev-qa-db-ja.com

スキャナーで行を読む

編集さらなる読者のために:入力ファイルが破損しているという問題がありました。

私が間違っていることを理解していません:

私はこのコードを使用していました:

    File f = new File("C:\\Temp\\dico.txt");
    BufferedReader r = null;
    try {
        r = new BufferedReader(new FileReader(f));
        String scan;
        while((scan=r.readLine())!=null) {
            if(scan.length()==0) {continue;}
            //treatment
        }
    } catch (FileNotFoundException ex) {
        Logger.getLogger(Lexique.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(Lexique.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        if(r!=null) try {
            r.close();
        } catch (IOException ex) {
            Logger.getLogger(Lexique.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

これはうまく機能しています。今、何らかの理由で、私はスキャナーに変更したかった。私のコードは次のようになりました:

    File f = new File("C:\\Temp\\dico.txt");
    Scanner r = null;
    try {
        r = new Scanner(f);
        String scan;
        while(r.hasNextLine()) {
            scan = r.nextLine();
            if(scan.length()==0) {continue;}
            //treatment
        }
    } catch (FileNotFoundException ex) {
        Logger.getLogger(Lexique.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(Lexique.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        if(r!=null) r.close();
    }

今回は、r.hasNextLine()が常に「false」を返すため、whileに入ることはありません。私が間違っていることについてのアイデアはありますか?

私は他に何も変わっていないことを正確に述べました、ファイルはまだ同じです。

編集 :別のファイルで試したところ、同じ結果が得られたことも正確でした。つまり、明らかにファイルからのものではないということです。

ファイルは次のようになります。

a
à
abaissa
abaissable
abaissables
abaissai
abaissaient
abaissais
abaissait
...

編集2: ファイルのコンテンツをコピー/貼り付けした場合にのみ問題が続くため、ファイルのコンテンツには問題があるようです。明らかに、コンテンツを自分で書いた場合は機能しますが、dico.txtファイルのコンテンツの一部を使用した場合は機能しません。説明はありますか?

編集3: これらは私のファイルへのリンクです。非常に巨大なdico.txtを避けることをお勧めします。

dico.txt: https://drive.google.com/file/d/0B0sroFy9HZlBNDl3MUwzVnh6VU0/edit?usp=sharing

test.txt: https://drive.google.com/file/d/0B0sroFy9HZlBemZjbXU1RmlmdjQ/edit?usp=sharing

26
Sharcoux

このコードは、ファイルを1行ずつ読み取ります。

public static void readFileByLine(String fileName) {
  try {
   File file = new File(fileName);
   Scanner scanner = new Scanner(file);
   while (scanner.hasNext()) {
    System.out.println(scanner.next());
   }
   scanner.close();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } 
 }

区切り文字を行区切りとして設定してから、同じことを実行することもできます。

 scanner.useDelimiter(System.getProperty("line.separator"));

次のトークンが利用可能かどうかを確認してから、次のトークンを読み取る必要があります。また、スキャナーへの入力を再確認する必要があります。すなわち、dico.txt。デフォルトでは、スキャナーは空白に基づいて入力を中断します。入力の区切り文字が正しい場所にあることを確認してください

コメントの更新された回答:

次のような内容の入力ファイルを作成しようとしました

a
à
abaissa
abaissable
abaissables
abaissai
abaissaient
abaissais
abaissait

以下のcode.itでそれを読み込もうとしましたが、うまくいきました。

 File file = new File("/home/keerthivasan/Desktop/input.txt");
     Scanner scr = null;
         try {
            scr = new Scanner(file);
            while(scr.hasNext()){
                System.out.println("line : "+scr.next());
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ScannerTest.class.getName()).log(Level.SEVERE, null, ex);
        }

出力:

line : a
line : à
line : abaissa
line : abaissable
line : abaissables
line : abaissai
line : abaissaient
line : abaissais
line : abaissait

だから、私はこれが機能するはずだと確信しています。 Windows環境で作業しているため、行末(EOL)シーケンス(0x0D 0x0A、\ r\n)は実際には2つのASCII文字、CRとLF文字の組み合わせです。次のように区切り文字を使用するようにScannerインスタンスを設定すると、おそらくピックアップされます

 scr = new Scanner(file);
 scr.useDelimiter("\r\n");

その後、ループを実行して行を読み取ります。お役に立てれば!

20
Keerthivasan

next()およびnextLine()メソッドはScannerに関連付けられ、文字列入力を取得するために使用されます。それらの違いは...

next()は、スペースまでしか入力を読み取ることができません。スペースで区切られた2つの単語を読み取ることはできません。また、next()は、入力を読み取った後、カーソルを同じ行に配置します。

nextLine()は、単語間のスペースを含む入力を読み取ります(つまり、行\ nの終わりまで読み取ります)。入力が読み取られると、nextLine()はカーソルを次の行に配置します。

記事を読む: next()とnextLine()の違い

Whileループを次のように置き換えます。

while(r.hasNext()) {
                scan = r.next();
                System.out.println(scan);
                if(scan.length()==0) {continue;}
                //treatment
            }

hasNext()およびnext()メソッドを使用すると、問題が解決します。

5
Nishant Lakhara
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication1;

import Java.io.File;
import Java.util.Scanner;

/**
 *
 * @author zsagga
 */
class openFile {
        private Scanner x ; 
        int count = 0 ; 
        String path = "C:\\Users\\zsagga\\Documents\\NetBeansProjects\\JavaApplication1\\src\\javaapplication1\\Readthis.txt"; 


    public void openFile() {
//                System.out.println("I'm Here");
        try {
            x = new Scanner(new File(path)); 

        } 
        catch (Exception e) {
            System.out.println("Could not find a file");
        }
    }

    public void readFile() {

        while (x.hasNextLine()){
            count ++ ;
            x.nextLine();     
        }
        System.out.println(count);
    }

    public void closeFile() {
        x.close();
    }
}

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication1;

/**
 *
 * @author zsagga
 */
public class JavaApplication1 {

    public static void main(String[] args) {
        // TODO code application logic here
        openFile r =  new openFile(); 
        r.openFile(); 
        r.readFile();
        r.closeFile(); 

    }
}
1
Zuhair Sagga

Javaスキャナーでまだ簡単な.txtファイルを読み取れないすべての人のために。


情報をコピーして貼り付けたとき、またはファイルに大量のテキストがあったときに、スキャナーが次の行を読み取れないという問題がありました。

解決策は、.txtファイルをUTF-8にコーディングします。
これは、ファイルを再度開いて保存し、コーディングをUTF-8に変更することで、非常に簡単に実行できます。 (右下隅近くのWin7の下)

この後、スキャナーに問題はないはずです。

r.hasNextLine()の代わりにr.hasNext()を使用してみてください:

while(r.hasNext()) {
        scan = r.next();
0
yuvalhuck