Java - 使用各种数据类型读取CSV文件的最有效方法

时间:2017-06-07 14:55:20

标签: java excel csv

我正在尝试使用各种数据类型读取CSV文件。

表格的一行如下所示:

Single,Monthly,Accelerated,John,Smith,08/15/1951,是

然后,我需要将每个字段分配给变量名称,执行一些计算,打印输出,然后移动到Excel工作表中的下一行

到目前为止,我一直在使用以下

ArrayList<String> lines = new ArrayList<>();
try {
    BufferedReader reader = new BufferedReader(new FileReader(fileName));
    String line = null;
    while ((line = reader.readLine()) != null) {
        lines.add(line);
        }

但是这会创建一个数组,每个插槽包含一个长字符串,其中包含相应excel行的文本(包括逗号)。 这似乎效率低下且不切实际,因为我必须遍历每个槽/字符串以提取值。

一旦我掌握了这种方法,我就不会在编写代码时遇到任何问题,但我不知道最好的方法来解决这个问题

分别读取每个单元格并分配给变量是否更好? 或者,最好一次读取文件并在之后遍历它? 也许有一种更有效的方法来完成这项任务

编辑:我也尝试将整个CSV文件作为2D数组读取,但不同的数据类型可能是一个问题..?

2 个答案:

答案 0 :(得分:0)

您无需存储线条。而是创建一个表示每一行的类,并将它们添加到列表中。

类似的东西:

/Completed Reports

你可以保留它们没有任何访问限定符或将它们设为私有并添加getter / setter。

在文件阅读器中,使用csv中使用的分隔符分割行,默认情况下为逗号(class MyData { String status; String salary; String accelerated; String firstName; String lastName; String date; String trueOrFalse; }

,

如果您只想进行一些计算和打印,则不需要单独的课程,甚至不需要ArrayList<MyData> datas = new ArrayList<MyData>(); while ((line = reader.readLine()) != null) { String[] columns = line.split( "," ); MyData data = new MyData(); data.status = columns[0]; data.salary = columns[1]; . . data.trueOrFalse = columns[6]; datas.add( data ); }

只是做:

ArrayList<String> lines

如果是这种情况,则无需存储信息。

答案 1 :(得分:0)

你可以尝试类似的东西。使用StringTokenizer以逗号分隔行,并在每次迭代中将这些元素作为字符串添加到另一个List中。

ArrayList<ArrayList<String>> lines = new ArrayList<>();
try {
    BufferedReader reader = new BufferedReader(new FileReader(fileName));
    String line = null;
    while ((line = reader.readLine()) != null) {
        ArrayList<String> tokens = new ArrayList<>();
        StringTokenizer st = new StringTokenizer(line, ",");
        while (st2.hasMoreElements()) {
            tokens.add(st2.nextElement());
        }
        lines.add(tokens);
    }
}

现在您可以使用适当的强制转换将它们转换为您想要的类型。例如,要获取日期,

DateFormat format = new SimpleDateFormat("mm/dd/yyyy", Locale.ENGLISH);
String dateString = lines.get(0).get(5);
Date date = format.parse(dateString);