2016-07-18 5 views
1

Вот простая проблема:Чтение CSV в Java/Jython

public static double[] stringsToDoubles(String[] inputArr) { 
    double[] nums = new double[inputArr.length]; 
    for (int i = 0; i < nums.length; i++) { 
     nums[i] = Double.parseDouble(inputArr[i]); 
    } 
    return nums; 
} 

public static double[][] readPointCloudFile(String filename, int n) { 
    double[][] points = new double[n][]; 
    String delimiter = ","; 
    Scanner sc = new Scanner(filename); 
    for (int i = 0; i < n; i++) { 
     String line = sc.nextLine(); 
     points[i] = stringsToDoubles(line.split(delimiter)); 
    } 
    return points; 
} 

из Jython я импортировать должным образом, а затем вызвать функцию как

readPointCloudFile("points.txt", 3) 

Это дает ошибку

java.lang.NumberFormatException: java.lang.NumberFormatException: For input string: "points.txt" 
+1

Вы никогда не читали из файла. Вы передаете имя файла Сканеру и считаете, что эта строка - это данные csv, но это всего лишь имя файла. – f1sh

+0

Да, мне кажется, мне нужно сделать что-то вроде нового файла (filename) или somthing –

+1

BTW, библиотека [Apache Commons CSV] (http://commons.apache.org/proper/commons-csv/) может помочь с этим хором чтения CSV-файлов. –

ответ

1

Вы никогда не читали из файла. Вы передаете имя файла Сканеру и считаете, что эта строка - это данные csv, но это всего лишь имя файла. Чтение файла может быть сделано следующим образом при использовании Java 8:

import java.nio.file.Files; 
import java.nio.file.Paths; 
[...] 

public static double[][] readPointCloudFile(String filename, int n) { 
    double[][] points = new double[n][]; 
    String delimiter = ","; 
    String filecontent = new String(Files.readAllBytes(Paths.get(filename))); 
    Scanner sc = new Scanner(filecontent); 
    for (int i = 0; i < n; i++) { 
     String line = sc.nextLine(); 
     points[i] = stringsToDoubles(line.split(delimiter)); 
    } 
    return points; 
} 
1

Вот мое решение в духе решения собственных проблем, но я дам кому-то кредит, потому что другие решения, вероятно, лучше.

public static double[] stringsToDoubles(String[] inputArr){ 
    double[] nums = new double[inputArr.length]; 
    for(int i = 0; i < nums.length; i++){ 
     nums[i] = Double.parseDouble(inputArr[i]); 
    } 
    return nums; 
} 

public static double[][] readPointCloudFile(String filename, int n) throws FileNotFoundException{ 
    double[][] points = new double[n][]; 
    String delimiter = ","; 
    try{ 
     Scanner sc = new Scanner(new File(filename)); 
     for(int i = 0; i < n; i++){ 
      String line = sc.nextLine(); 
      points[i] = stringsToDoubles(line.split(delimiter)); 
     } 
    } catch (FileNotFoundException e){ 
     System.err.println(e.getMessage()); 
    } finally { 
     return points; 
    } 
} 
+1

Это еще проще, чем мой ответ. Я никогда не работаю с '' Scanner'' и не знал, что он принимает аргумент '' File''. Удачи в дальнейшей работе :) – f1sh