从csv文件发出加载数据 - Java

时间:2016-03-09 03:47:57

标签: java csv

目前我有一个.csv文件形式的数据集,您可以找到here。还有一些简短的文档,您可以找到here。我试图做的是操纵数据集,以便我可以使用一些机器学习算法,但就目前而言,我似乎无法将输出的数据打印到控制台

ImageMatrix.java

import java.util.Arrays;


public class ImageMatrix {
    public static int[] data;
    public int classCode;
    public ImageMatrix(int[] data, int classCode) {
        assert data.length == 64;

    }

    public String toString() {
        return "Class Code: " + classCode + " DataSet:" + Arrays.toString(data) + "\n";
    }

    public int[] getData() {
        return data;
    }

    public int getClassCode() {
        return classCode;
    }

}

ImageMatrixDB.java

import java.io.*;
import java.util.*;




public class ImageMatrixDB implements Iterable<ImageMatrix> {
    List<ImageMatrix> list = new ArrayList<ImageMatrix>();

    public static ImageMatrixDB load(String f) throws IOException {
        ImageMatrixDB result = new ImageMatrixDB();
        try (FileReader fr = new FileReader(f);
             BufferedReader br = new BufferedReader(fr)) {
            for (String line; null != (line = br.readLine()); ) {
                int lastComma = line.lastIndexOf(',');
                int classCode = Integer.parseInt(line.substring(1 + lastComma));
                int[] data = Arrays.stream(line.substring(0, lastComma).split(","))
                                   .mapToInt(Integer::parseInt)
                                   .toArray();
                result.list.add(new ImageMatrix(data, classCode));
            }
            System.out.println(ImageMatrix.data.toString());
        }
        return result;
    }



    public Iterator<ImageMatrix> iterator() {
        return this.list.iterator();
    }
    public static void main(String[] args){
        ImageMatrixDB i = new ImageMatrixDB();
        i.load("dataset1.csv"); // <<< ERROR IS HERE
    }
}

错误在我的主要功能i.load(...我知道我必须丢失某些东西或在某处犯了错误,我已经尝试改变静态数据,但它只会引发更多错误,我无法弄清楚。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您的问题出在ImageMatrix课程中。 您永远不会在构造函数中设置int[] data。你有:

    public ImageMatrix(int[] data, int classCode) {
        assert data.length == 64;

    }

你需要:

    public ImageMatrix(int[] data, int classCode) {
        assert data.length == 64;
        this.data = data;
        this.classCode = classCode;
    }

这是您的更新/完整/正常工作代码:

ImageMatrix:

import java.util.*;

public class ImageMatrix {
    private int[] data;
    private int classCode;

public ImageMatrix(int[] data, int classCode) {
    assert data.length == 64;
    this.data = data;
    this.classCode = classCode;
}

    public String toString() {
        return "Class Code: " + classCode + " DataSet:" + Arrays.toString(data) + "\n";
    }

    public int[] getData() {
        return data;
    }

    public int getClassCode() {
        return classCode;
    }

}

ImageMatrixDB:

    import java.util.*;
    import java.io.*;

    public class ImageMatrixDB implements Iterable<ImageMatrix> {
        private List<ImageMatrix> list = new ArrayList<ImageMatrix>();

        public ImageMatrixDB load(String f) throws IOException {
            try (
                FileReader fr = new FileReader(f);
                BufferedReader br = new BufferedReader(fr)) {
                String line = null;

                while((line = br.readLine()) != null) {
                    int lastComma = line.lastIndexOf(',');
                    int classCode = Integer.parseInt(line.substring(1 + lastComma));
                    int[] data = Arrays.stream(line.substring(0, lastComma).split(","))
                                       .mapToInt(Integer::parseInt)
                                       .toArray();
                    ImageMatrix matrix = new ImageMatrix(data, classCode);
                    list.add(matrix);
                }
            }
            return this;
        }

        public void printResults(){
            for(ImageMatrix matrix: list){
                System.out.println(matrix);
            }
        }


        public Iterator<ImageMatrix> iterator() {
            return this.list.iterator();
        }
        public static void main(String[] args){
            ImageMatrixDB i = new ImageMatrixDB();
            try{
                i.load("cw2DataSet1.csv"); 
                i.printResults();
            }
            catch(Exception ex){
                ex.printStackTrace();
            }
        }

    }

答案 1 :(得分:1)

您的加载方法可以抛出IOException。您需要捕获它才能成功编译

public static void main(String[] args){
    ImageMatrixDB i = new ImageMatrixDB();
    try{
        i.load("dataset1.csv"); // <<< ERROR IS HERE
    }
    catch(Exception e){
        System.out.println(e.getMessage());
    }
}