2015-11-12 13 views
0

ZIPCODE, ГОРОД, ШТАТ, широта, долгота
ZIPCODE, ГОРОД, ШТАТ, широта, долготаПроблем с импортирующими файлами

Я пытаюсь сделать это в состоянии открыть текстовый файл с адресами, отформатированными как таковые, Создайте цикл, который создает новый объект ZipCode с пятью параметрами по порядку, а затем добавляет этот объект в ArrayList myZips.

У меня такое чувство, что по крайней мере мои разделители ошибаются.

public void readZipCodeData(String filename){ 

Scanner inFS = null; 
FileInputStream fileByteStream = null; 

try{ 
    // open the File and set delimiters 
    fileByteStream = new FileInputStream(filename); 
    inFS = new Scanner(fileByteStream); 
    inFS.useDelimiter(", *"); 

    // continue while there is more data to read 
    while(inFS.hasNext()) { 

     // read five data elements 
     int zipCode = inFS.nextInt(); 
     String city = inFS.next(); 
     String state = inFS.next(); 
     double latitude = inFS.nextDouble(); 
     double longitude = inFS.nextDouble(); 
     ZipCode z1 = new ZipCode(zipCode, city, state, latitude, longitude); 
     myZips.add(z1); 
    } 
    fileByteStream.close(); 

    // Could not find file 
    }catch(FileNotFoundException error1) { 
     System.out.println("Failed to read the data file: " + filename); 
    // error while reading the file      
    }catch(IOException error2) { 
     System.out.println("Oops! Error related to: " + filename); 
}   

}

Everytime я пытаюсь запустить его, как это дает мне
java.util.InputMismatchException: нуль (в java.util.Scanner) ошибка на двойной линии долготы. Есть идеи?

+0

В чем вопрос? – gonzo

+0

woops, это отрезало это, всего в секунду – David

ответ

0

Я не знаком с Scanner для ввода, а скорее BufferedReader. Я считаю, это простой в использовании, и я надеюсь, что это решение работает для вас:

Charset charset = Charset.forName("US-ASCII"); 
try (BufferedReader reader = Files.newBufferedReader(filename, charset)) { 
    String line = null; 
    while ((line = reader.readLine()) != null) { 

     // THIS IS THE CODE FOR EVERY LINE 
     String[] data = line.split(", "); 
     int zipCode = Integer.parseInt(data[0]); 
     String city = data[1]; 
     String state = data[2]; 
     double latitude = Double.parseDouble(data[3]); 
     double longitude = Double.parseDouble(data[4]); 
     ZipCode z1 = new ZipCode(zipCode, city, state, latitude, longitude); 
     myZips.add(z1); 

    } 
} catch (IOException x) { 
    System.err.format("IOException: %s%n", x); 
} catch (NumberFormatException x) { 
    System.err.format("NumberFormatException: %s%n", x); 
} 

В этом примере, я прочитал целую строку с BufferedReader.readLine() и вручную разобрать его с помощью String.split() и Integer.parseInt()/Double.parseDouble(). Это более интуитивно, и это работает!

См. working example here.


Из-за нижеприведенного комментария, я думаю, я не могу предложить ответ выше. Однако есть две потенциальные проблемы, которые я вижу:

  • Возможно, вы не положили double во входной файл. Простая, честная ошибка.
  • Или, по this SO answer, ваш язык может быть установлен неправильно. В некоторых местах они используют , для десятичной точки вместо . Попробуйте переключить их.
+0

Мой учитель очень строг в использовании кода, предоставленного вам. Если бы я использовал это, даже если бы это было правильно, она пошла бы с ума. Не знаю почему – David

+0

@ Давид, может быть, вы можете посмотреть пример, который я вам предоставил? Это может дать вам идеи. Поскольку вы не опубликовали весь свой код, могут быть ошибки в другом месте. –

+0

Единственное, что я могу думать о том, что это неправильно, так это вход - возможно, вы не вводили двойной? –

0

Попробуйте что-нибудь подобное. Вместо разбора одного поля за раз, возьмите всю строку, переверните ее в массив String, используя разделитель ,, затем проанализируйте до int/double. Scanner.nextLine() захватывает всю линию для вас.

try{ 
    // open the File and set delimiters 
    fileByteStream = new FileInputStream(filename); 
    inFS = new Scanner(fileByteStream); 


     // read five data elements 
      String[] data = inFS.nextLine().split(", "); 
      int zipCode = Integer.parseInt(data[0]); 
      String city = data[1]; 
      String state = data[2]; 
      double latitude = Double.parseDouble(data[3]); 
      double longitude = Double.parseDouble(data[4]); 
     ZipCode z1 = new ZipCode(zipCode, city, state, latitude, longitude); 
     myZips.add(z1); 
Смежные вопросы