Java:提高读者程序的速度

时间:2017-03-24 23:26:17

标签: java csv

嘿所以我正在研究这个读取CSV文件的程序,我需要制作一个可以在值上返回整列的方法。

目前我这样做:

List<String> data = new LinkedList<>();

    for(int i = 0; i < getRowCount(); i++){
         data.add(getRow(i).get(column));
    }

getRow()是这样的:

List<String> data = new LinkedList<>();
    String column;

    try (BufferedReader bufferedReader = new BufferedReader(new FileReader(file))) {
        for(int i = 0; i < row; i++){
            bufferedReader.readLine();
        }
        column = bufferedReader.readLine();
        for(String col: column.split(columnSeparator.toString())){
            data.add(col);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

它有效。但缺点是,如果文件中的列太多,则需要太长时间。它需要27秒,即7500行和9列。在35000行和16列上超过10分钟。你知道我怎么能让它更快?

3 个答案:

答案 0 :(得分:1)

尝试阅读一次文件:

List<String> getColumn(int column) {
    try (BufferedReader bufferedReader = new BufferedReader(new FileReader(file))) {
        List<String> data = new LinkedList<>();
        String line = bufferedReader.readLine();
        while (line != null) {
            String cols[] = line.split(columnSeparator.toString());
            data.add(cols[column]);
            line = bufferedReader.readLine();
        }
        return data;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

答案 1 :(得分:0)

我建议你试试这个

DataType<T> listRef = getRowCount();
for(int i = 0; i < listRef.size(); i++)
    {
         data.add(getRow(i).get(column));
    }
当你在for语句中调用它时,每次执行getRowCount都会被执行,你最终会得到所有的行但是在内部我相信调用它会执行该方法getRowCount()。size()次并且你可能不会我想多次阅读一个文件

答案 2 :(得分:0)

您正在做的是以下内容:

  1. 准备阅读文件(创建ReaderObject,...),阅读第一行
  2. 准备阅读文件,阅读第一行,阅读第二行
  3. Preapre读取文件,读取第一行,读取第二行,读取第三行
  4. ..等等。 显然这不是很有效(你在O(n²)做的东西,n =行数)。

    如果你这样做,你可以大大改善你的代码:

    1. 准备阅读文件
    2. 阅读第一行
    3. 阅读第二行
    4. ......等等。 所以先要一次读完所有的行:

      List<String> lines = new LinkedList<>();
      
      try (BufferedReader br = new BufferedReader(new FileReader(file))) {
          String line;
          while ((line = br.readLine()) != null)
              lines.add(line);
      } catch (IOException e) {
          e.printStackTrace();
      }
      

      然后,您可以遍历这些行将它们拆分成列并提取您感兴趣的数据:

      List<String> data = new LinkedList<>();
      
      for(String line : lines)
           data.add(line.split(columnSeparator.toString())[column]);
      

      当然,这仍然需要一些错误处理:)