2016-07-18 25 views
1

Hier ist ein einfaches Problem:Lesen ist eine CSV in 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; 
} 

von jython ich richtig importieren, und rufen Sie dann die Funktion als

readPointCloudFile("points.txt", 3) 

Diese

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

Sie lesen nie aus der Datei. Sie übergeben den Dateinamen an den Scanner und nehmen an, dass diese Zeichenfolge Ihre CSV-Daten ist, aber es ist nur der Dateiname. – f1sh

+0

Ja, ich denke, ich muss etwas wie neue Datei (Dateiname) oder etwas tun –

+1

BTW, die [Apache Commons CSV] (http://commons.apache.org/proper/commons-csv/) Bibliothek kann dabei helfen mühsames Lesen von CSV-Dateien. –

Antwort

1

Sie lesen nie aus der Datei. Sie übergeben den Dateinamen an den Scanner und nehmen an, dass diese Zeichenfolge Ihre CSV-Daten ist, aber es ist nur der Dateiname. Lesen einer Datei kann wie folgt ausgeführt werden, wenn Sie Java 8 verwenden:

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

im Geiste meine Lösung hier Ihre eigenen Probleme zu lösen, aber ich werde jemand anderes Kredit geben, weil die anderen Lösungen wahrscheinlich besser sind.

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

Das ist noch einfacher als meine Antwort. Ich arbeite nie mit '' Scanner'' und wusste nicht, dass es ein '' File'' Argument braucht. Viel Glück bei der weiteren Arbeit :) – f1sh