web-dev-qa-db-ja.com

ファイルを読み取る際の区切り文字の使用

区切り文字を使用した経験がほとんどなく、データがコンマ( "、")で区切られた単一行に格納されている複数のオブジェクトを格納するテキストファイルを読み取る必要があります。次に、個別の文字列を使用して、arraylistに追加される新しいオブジェクトを作成します。

Amadeus,Drama,160 Mins.,1984,14.83
As Good As It Gets,Drama,139 Mins.,1998,11.3
Batman,Action,126 Mins.,1989,10.15
Billy Elliot,Drama,111 Mins.,2001,10.23
Blade Runner,Science Fiction,117 Mins.,1982,11.98
Shadowlands,Drama,133 Mins.,1993,9.89
Shrek,Animation,93 Mins,2001,15.99
Snatch,Action,103 Mins,2001,20.67
The Lord of the Rings,Fantasy,178 Mins,2001,25.87

Scannerを使用してファイルを読み取っていますが、no line foundエラーが発生し、ファイル全体が1つの文字列に格納されます。

Scanner read = new Scanner (new File("datafile.txt"));
read.useDelimiter(",");
String title, category, runningTime, year, price;

while (read.hasNext())
{
   title = read.nextLine();
   category = read.nextLine();
   runningTime = read.nextLine();
   year = read.nextLine();
   price = read.nextLine();
   System.out.println(title + " " + category + " " + runningTime + " " +
                      year + " " + price + "\n"); // just for debugging
}
read.close();
7
Robert Spratlin

Read.nextLine()の代わりにread.next()を使用してください

   title = read.next();
   category = read.next();
   runningTime = read.next();
   year = read.next();
   price = read.next();
13
muffy

.next()の代わりに文字列を返す.nextLine()を呼び出したいと思います。 .nextLine()呼び出しが現在の行を過ぎています。

Scanner read = new Scanner (new File("datafile.txt"));
   read.useDelimiter(",");
   String title, category, runningTime, year, price;

   while(read.hasNext())
   {
       title = read.next();
       category = read.next();
       runningTime = read.next();
       year = read.next();
       price = read.next();
     System.out.println(title + " " + category + " " + runningTime + " " + year + " " + price + "\n"); //just for debugging
   }
   read.close();
3
majorbanzai

next();を使用している場所でnextLine();を使用する必要があります

チュートリアルをご覧ください: http://docs.Oracle.com/javase/tutorial/essential/io/scanning.html

次の行に注意してください。

try {
   s = new Scanner(new BufferedReader(new FileReader("xanadu.txt")));

   while (s.hasNext()) {
   System.out.println(s.next());
}
2
mcalex

また、String.split()関数を使用して文字列を文字列の配列に変換し、それぞれの値を反復処理して値を求めることもできます。

カンマ区切りの文字列をArrayListに変換する方法 詳細については、こちらを参照してください。

1
Aniket Inge

上記の答えはすべて正しく、実際には同じです。ただし、Scannerのバッファサイズは1024のみであることを誰もが覚えておくべき重要な点があります。つまり、区切られたテキストの長さがそれ以上になると、解析が停止します。

したがって、指定されたソリューションを少し拡張するには、ファイルを直接BufferedReaderに渡す代わりにScannerを使用します。例:

    BufferedReader in = new BufferedReader(new FileReader("datafile.txt"), 16*1024);
    Scanner read = new Scanner(in);
    read.useDelimiter(",");
    String title, category, runningTime, year, price;

    while(read.hasNext())
    {
        title = read.next();
        category = read.next();
        runningTime = read.next();
        year = read.next();
        price = read.next();
        System.out.println(title + " " + category + " " + runningTime + " " + year + " " + price + "\n"); //just for debugging
    }
    read.close();
0
user846316

1つの問題は次のとおりです。

while(read.hasNext())
   {
       title = read.nextLine();
       category = read.nextLine();
       runningTime = read.nextLine();

hasNext()

このスキャナーの入力に別のトークンがある場合、trueを返します。行全体ではありません。 hasNextLine() を使用する必要があります

NextLine()を3回実行しています。行を読んで行を分割する必要があると思います。

0
kosa