0

我有一个文本文件包含

r0, 0.5, 1
r1, 0.6, -1
r2, 0.2, 1

我想读取文件并将每一列存储在java中的单独数组中。这是我一直在写的代码。我只在记录中得到垃圾值。另外,我无法读取浮点值。请告诉我如何解决这个问题。

public class Model{
    private String modelname ;
private String[] records ;
private int[] targets ;
private float[] scores ;

    public Model(String name_model, String path) throws NumberFormatException, IOException {


    this.modelname = path+name_model ;
    System.out.println(this.modelname);

    BufferedReader bufferReader = new BufferedReader(new FileReader(path+name_model));
    String line=null;
    int t=0;
    while((line = bufferReader.readLine())!=null) {
        System.out.println(line);
        //String[] strar = line.split(",");
        //String[] strar = line.split("\\s*,\\s*")  ;
        int k=1 ;
        for(String part : line.split(",")) {
            if (k==1) {
                System.out.println(part.trim());
                this.records[t] = part.trim() ;
                            }
            if (k==3)
                this.targets[t] = Integer.valueOf(part.trim()) ;
            if (k==2)
                this.scores[t] = Float.parseFloat(part.trim()) ;
            k=k+1 ;
        }
        System.out.println(this.records[t] + " " + this.targets[t] + " " + this.scores[t]);
        t=t+1;
    }
}
public static void main(String[] args) throws Exception, IOException {

    String s1, s2, s3 ;
    s1 = "./direc/" ;
    s2 = "file1.txt" ;
    s3 = s1+s2 ;
    System.out.println(s3);
    new Model(s2, s1);
}

}

4

3 回答 3

0

if (k==1)如果您在这种情况下不使用大括号,则this.records[t]始终分配最后一部分。代码应该是:

        if (k==1) {
            System.out.println(part.trim());
            this.records[t] = part.trim() ;
        }

此外,您在输入第二行的 0.6 之后缺少逗号。

于 2013-06-21T17:49:33.607 回答
0

您可以简化解析。您可以取消内部循环并避免修剪为

String[] parts = line.split(", ");

this.records[t] = parts[0];
this.scores[t] = Float.parseFloat(parts[1]);
this.targets[t] = Integer.parseInt(parts[2]);

我假设你忘了把第二个逗号放在这里

r1, 0.6, -1

而且,由于您使用的是原始int[]使用Integer.parseInt()而不是Integer.valueOf()(返回Integer包装器)以避免不必要的拆箱。

编辑
您还需要初始化所有数组,例如

private String[] records = new String[100]; // initialization is MISSING!

因为,在您的情况下,它的大小Array取决于输入数据文件中的行数,它需要是动态的。考虑切换到一个ArrayList会动态增长的。

private List<String> records = new ArrayList<String>();
private List<Integer> targets = new ArrayList<Integer>();
private List<Float> scores = new ArrayList<Float>();

因为,您需要使用包装器类型才能使用集合;切换回valueOf()方法。

String[] parts = line.split(", ");

this.records.add(parts[0]);
this.scores.add(Float.valueOf(parts[1]));
this.targets.add(Integer.valueOf(parts[2]));
于 2013-06-21T17:54:54.080 回答
0

我喜欢用来读取文件的一种简单方法是利用 Scanner 和 File 类

所以从导入那些 java.util.Scanner 开始;java.io.*;

然后在您的代码中(不要忘记抛出 IOException): File filename = new File("filename.txt"); 扫描仪 fileScanner = new Scanner(filename);

现在,如果您使用数组,则需要知道数组的大小才能创建它,以及它的类型。

并考虑您的文本文件如下所示:
1.0 2.7 6.3 8.4 8.6
2.0 9.4 9.1 3.0 4.2
3.4 7.7 8.3 3.2 1.0

如果您的文件可以包含逗号,请在创建扫描仪后添加此行:

fileScanner.useDelimiter(", ")

并且您希望 5 个数组包含每行浮点数或整数等...创建 5 个大小为 3 的数组,然后使用此循环添加每个数字:

int rank = 0;
double[] r1 = new double[3];
.
.
.
double[] r5 = new double[3];
while(fileScanner.hasNext())
{
    if(fileScanner.hasNextDouble()) r1[rank] = fileScanner.nextDouble();
    if(fileScanner.hasNextDouble()) r2[rank] = fileScanner.nextDouble();
    if(fileScanner.hasNextDouble()) r3[rank] = fileScanner.nextDouble();
    if(fileScanner.hasNextDouble()) r4[rank] = fileScanner.nextDouble();
    if(fileScanner.hasNextDouble()) r5[rank] = fileScanner.nextDouble();
    rank++;
}
于 2013-06-21T17:58:37.910 回答