2

我尝试读出一个 csv 文件。在我的代码中,我读出了 csv 文件中的行。因此,我使用 arraylist 将行中的每个项目添加到 arraylist。

读出一行后,我将数组列表存储在另一个数组列表中,然后读取下一行,依此类推。

现在我有几个问题和一个问题。

1)当我将一个项目添加到一个数组列表时,它是否总是添加到列表的末尾(当我没有给出在我的代码中添加项目的具体位置时)?这样就可以保持 csv 文件的顺序。

2)我发现,当我清除 arraylist datatemp 以准备读取下一行时,数组列表数据的内容也被清除。如何防止我的代码这样做?

3)有没有办法从我拥有的arraylist数据中制作一个普通的数组?

4) 我读出 csv-File 的方式是正确的还是有更好的方法?

public class CSVReader {    

public void ReadCSV (String csvfilepath) {

    BufferedReader CSVFile = null;
    String dataRow = null;
    ArrayList<Float> datatemp = new ArrayList<Float>(); 
    ArrayList<ArrayList<Float>> data = new ArrayList<ArrayList<Float>>(); 

    try {
        CSVFile = new BufferedReader(new FileReader(csvfilepath));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    try {
        dataRow = CSVFile.readLine();
    } catch (IOException e) {
        e.printStackTrace();
    }

    while (dataRow != null){
        String[] dataArray = dataRow.split(",");
        for (String item:dataArray) {
            datatemp.add(Float.valueOf(item));
        }
        try {
            dataRow = CSVFile.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }

        data.add(datatemp);
        datatemp.clear();
    }

    try {
        CSVFile.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    }
} 
4

4 回答 4

2

1)这样,csv文件的顺序将被保留。

是的

2)如何防止我的代码这样做?

每次都需要创建一个新的 tempArrayList:

while (dataRow != null){
    datatemp = new ArrayList<Float>();

3)有没有办法从我拥有的arraylist数据中制作一个普通的数组?

您可以创建一个数组列表数组:

ArrayList[] array = data.toArray(new  ArrayList[data.size()]);

然后你可以递归地创建一个二维数组,但我会坚持使用更容易处理的列表列表。

4) 我读出 csv-File 的方式是正确的还是有更好的方法?

使用一个库,有很多,已经测试过了。正确解析 CSV 文件比乍看起来要困难得多。

于 2012-12-10T16:22:07.447 回答
1

广告 1. 你读过 ArrayList 参考资料吗?方法 add() “将指定元素附加到此列表的末尾。”

广告 2。您似乎还不了解参考的工作原理。只需在循环内声明 datatemp 并且不要清除它,它应该可以正常工作。

广告 3. 请阅读课程参考。有一种排列方法。在我们的示例中像这样使用它:

Float[] array = data.toArray(new Float[data.size()])

广告 4. 如果这不是学校作业,请使用图书馆。检查此线程:Java 的 CSV API

PS:请使用 Oracle 的文档,您的所有答案都在这里:http ://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

于 2012-12-10T16:27:47.933 回答
0

不看细节,为什么不http://opencsv.sourceforge.net/?自己用过,好东西,相信我

于 2012-12-10T16:19:47.823 回答
0

您将 datatemp 添加到数据数组,但随后清除数组。它也会清除数据中的数据。你需要像这样复制数组:

data.add(new ArrayList<Float>( datatemp ) );

我建议使用开源 csv 库而不是自己进行解析。

于 2012-12-10T16:27:24.533 回答