2015-09-06 2 views
0

Сканер считывает неправильные данные в текстовом формате файла:Почему моя программа не распознает фамилии должным образом?

111,Smith,Sam, 40,10.50 
330,Jones,Jennifer,30,10.00

Программа:

public class P3 { 
    public static void main(String[] args) { 
     String file=args[0]; 
     File fileName = new File(file); 
     try { 
      Scanner sc = new Scanner(fileName).useDelimiter(", "); 
      while (sc.hasNextLine()) { 
       if (sc.hasNextInt()){ int id = sc.nextInt();} 
       String lastName = sc.next(); 
       String firstName = sc.next(); 
       if (sc.hasNextInt()){ int hours = sc.nextInt(); } 
       if (sc.hasNextFloat()){ float payRate=sc.nextFloat(); } 
       System.out.println(firstName); 
      } 
      sc.close(); 
     } catch(FileNotFoundException e) { 
      System.out.println("Can't open file "  
           + fileName + " "); 
     } 
    } 
} 

Выход:

40,10.50 
330,Jones,Jennifer,30,10.00 

Оно должно быть:

Sam 
Jennifer 

Как это исправить?

+0

А как насчет Смита и Джонса? –

+0

if is System.out.println (lastName); –

+0

он должен печатать Смит и Джонс –

ответ

0

Прежде всего, пожалуйста, поменяйте fileName и file. Затем я предлагаю вам использовать try-with-resources. Ваши переменные должны быть в общей области, если вы собираетесь их использовать. Наконец, при использовании hasNextLine() я бы тогда вызоваnextLine и вы можете split на опциональный белого пространства и запятой. Это может выглядеть примерно так:

String fileName = // ... 
File file = new File(fileName); 
try (Scanner sc = new Scanner(file)) { 
    while (sc.hasNextLine()) { 
     String line = sc.nextLine(); 
     String[] arr = line.split("\\s*,\\s*"); 
     int id = Integer.parseInt(arr[0]); 
     String lastName = arr[1]; 
     String firstName = arr[2]; 
     int hours = Integer.parseInt(arr[3]); 
     float payRate = Float.parseFloat(arr[4]); 
     System.out.println(firstName); 
    } 
} catch (FileNotFoundException e) { 
    System.out.println("Can't open file " + fileName + " "); 
    e.printStackTrace(); 
} 
+0

, если нам нужно использовать сканер (файл) .useDelimiter (","), как его исправить? –

3

Проблема в том, что ваши данные не ограничиваются запятыми. Он также ограничен линией-окончаниями, а также Unicode character U+FF0C (FULLWIDTH COMMA).

Я взял свой код, заменил строку

Scanner sc = new Scanner(fileName).useDelimiter(", "); 

с

Scanner sc = new Scanner(fileName, "UTF-8").useDelimiter(", |\r\n|\n|\uff0c"); 

, а затем побежал. Он подготовил вывод, который он должен был использовать.

текст , |\r\n|\n|\uff0c является регулярное выражение, которое соответствует либо:

  • запятой с последующим пробелом,
  • возврата каретки (\r) с последующим переводом строки (\n),
  • в newline сама по себе,
  • a Unicode полная ширина запятой (\uff0c).

Это символы, которые мы хотим разграничить текст. Я указал оба типа окончания строки, так как не уверен, какие строки заканчиваются вашим файлом.

Я также установил сканер для использования кодировки UTF-8 при чтении из файла. Я не знаю, будет ли это иметь для вас значение, но в моей системе UTF-8 не является кодировкой по умолчанию, поэтому мне нужно было указать ее.

Смежные вопросы