从文本文件中读取并将内容存储在单独的数组中

时间:2013-06-21 17:35:06

标签: java file-io

我有一个包含

的文本文件
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);
}

}

3 个答案:

答案 0 :(得分:0)

如果您不在if (k==1)案例中使用大括号,this.records[t]将始终分配最后一部分。代码应该是:

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

另外,在输入的第二行0.6后,你错过了一个逗号。

答案 1 :(得分: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]));

答案 2 :(得分:0)

我喜欢用于阅读文件的一种简单方法是使用扫描程序和文件类

首先导入那些 java.util.Scanner的; java.io *;

然后在你的代码中(不要忘记抛出IOException): 文件filename =新文件(“filename.txt”); 扫描仪fileScanner =新的扫描仪(文件名);

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

并考虑您的文本文件如下:
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++;
}