2015-10-18 2 views
2

При попытке final project for my friend's ICS class я столкнулся с этой странной ошибкой.Почему использование Scanner.next() вызывает это странное поведение System.out.println()?

Одна из задач состояла в том, чтобы читать this CSV file. Это короткий SSCCE того, как я сделал это с помощью сканера:

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 

public class Test { 

    public static void main(String[] args) { 

     Scanner fileScanner; 
     String inputFile = "input-project.csv"; 

     try { 
      fileScanner = new Scanner(new File(inputFile)); 
      fileScanner.useDelimiter("[,\n]"); 
      fileScanner.nextLine(); 

      while(fileScanner.hasNext()) { 
       String name = fileScanner.next(); 
       String number = fileScanner.next(); 
       System.out.println("Inserting " + name + " " + number + " (" + hash(name) + ")"); 
       //telephoneBook.insert(name, number); 
      } 

      fileScanner.close(); 
     } catch (FileNotFoundException e) { 
      System.out.println("ERROR: Input file " + inputFile + " was not found"); 
     } 
    } 

    public static Integer hash(String name) { 
     return name.hashCode() % 7; 
    } 
} 

Он читает отлично, но по какой-то причине System.out.println("Inserting " + name + " " + number + " (" + hash(name) + ")") печатает только " (" + hash(name) + ")".

Взгляните на этот выход:

(5) 
(1) 
(4) 
(5) 
(3) 
(1) 
(4) 
(2) 
(2) 
(2) 

Process finished with exit code 0 

Во время игры с этим кодом, пытаясь решить эту проблему, я заканчивал фиксируя его не используя fileScanner.next(). Это мой текущий рабочий пример:

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 

public class Test { 

    public static void main(String[] args) { 

     Scanner fileScanner; 
     String inputFile = "input-project.csv"; 

     try { 
      fileScanner = new Scanner(new File(inputFile)); 
      //fileScanner.useDelimiter("[,\n]"); 
      fileScanner.nextLine(); // skip the first line 

      while(fileScanner.hasNext()) { 
       String[] line = fileScanner.nextLine().split(","); 
       String name = line[0]; 
       String number = line[1]; 
       //String name = fileScanner.next(); 
       //String number = fileScanner.next(); 
       System.out.println("Inserting " + name + " " + number + " (" + hash(name) + ")"); 
       //telephoneBook.insert(name, number); 
      } 

      fileScanner.close(); 
     } catch (FileNotFoundException e) { 
      System.out.println("ERROR: Input file " + inputFile + " was not found"); 
     } 
    } 

    public static Integer hash(String name) { 
     return name.hashCode() % 7; 
    } 
} 

Это печатает, как ожидалось:

Inserting HALL 123-4566 (5) 
Inserting BAKER 111-1111 (1) 
Inserting CARTER 222-2222 (4) 
Inserting KING 555-5555 (5) 
Inserting FOX 666-6666 (3) 
Inserting LEE 777-7777 (1) 
Inserting CASTRO 888-8888 (4) 
Inserting DAVIS 999-9999 (2) 
Inserting LONG 987-1234 (2) 
Inserting KAM 654-7890 (2) 

Process finished with exit code 0 

Мой вопрос теперь: Почему это исправить эту проблему? Я использовал метод .next() неправильно?

ответ

2

CSV-файл, который вы связали, имеет терминаторы линии CRLF, однако ваш разделитель только улавливает \n. Таким образом, \r делает его в вашей строке и делает форматирование вывода странным. Вместо этого попробуйте использовать другой разделитель:

fileScanner.useDelimiter(",|\r?\n"); 
Смежные вопросы