如何获得csv文件中每个字段的最大长度?

63lcw9qa  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(348)

我需要找出csv文件中每个字段的最大长度。
例如在下面 cvs 文件(因为1) var1 有最长的字符串 shj 三个字符,
2) var2 有最长的字符串 asdf -4个字符
3) var3asddfs -6个字符

var1,var2,var3
a,asdf,df
aa,,
shj,,asddfs

所以,我需要的结果是数组 int [] maxLength = {3,4,6} 到目前为止,我使用的是csv阅读器api。这是我的密码

CSVReader reader = new CSVReader (new FileReader(Looks.fileName));
        int [] maxLength = new int[reader.readNext().length];
        for (int i = 0; i < row.length; i++) {
            maxLength[i] = row[i].trim().length() ;
        }
        while ((row = reader.readNext()) !=null ) {
            for (int i = 0; i < row.length; i++) {
                maxLength[i] = Math.max(maxLength[i] , row[i].trim().length() );
            }
        }
        reader.close();

很好用。但是对于一个大文件来说太慢了。我有大约100000000行。
有什么有效的方法吗?我能用吗 setAsciiStream 如何更有效地估计长度?

yizd12fk

yizd12fk1#

你的代码是尽可能的高效-它只读取每个字节一次,一次,它不做任何昂贵的寻找文件。
有可能是 FileReader 在一个 BufferedReader 可以提高性能--尽管这不是不可能的 CSVReader 使用 BufferedReader 内部。
从磁盘读取100000000行的速度有物理限制。这是值得的基准测试最简单的程序,你可以写,读取整个文件,看看需要多长时间,才决定你的csv阅读器是缓慢的。

BufferedReader reader = new BufferedReader(new FileReader filename);
char[] buffer = new char[1024**1024*10]; // 10MB; whatever
while(reader.read(buffer,0,buffer.length) >= 0) {
     // nothing
}
reader.close();

更新:证实了我的怀疑,假设你使用的是opencsv。
以下是opencsv的源代码:http://sourceforge.net/p/opencsv/code/head/tree/trunk/src/au/com/bytecode/opencsv/
的构造函数 CSVReader Package Reader 在一个 BufferedReader 如果它还不是 BufferedReader . CSVReader.readNext() 只是打电话而已 BufferedReader.readLine() 反复地对字符进行一些基本的操作。
这是读取文件的最快方法:从头开始,一直读到最后,使用缓冲区以使底层磁盘读取的大小符合硬件和设备驱动程序的要求。
在一个大文件上运行上面的程序,你会发现它花费的时间和你的csv解析程序差不多——因为即使我的程序没有做任何明显的处理,它也和你的程序有同样的瓶颈——从磁盘读取的速度。
的确 cat largefile >/dev/null (unix)或 type largefile >NUL 也需要同样的时间。
使用探查器运行代码,您会发现它花费了更多的时间等待 read() (在作为核心java一部分的本机方法中)而不是其他任何地方。
你不能对你的java程序做任何事情来加速它。您可以通过调整硬件和/或操作系统来提高速度,比如调整文件系统参数和驱动程序设置,将文件放在ramdisk或ssd上,等等。

zc0qhyus

zc0qhyus2#

CSVReader 缓冲的?如果没有,把你的衣服包起来 FileReader 用一个 BufferedReader (并使其成为一个很好的大缓冲区大小)。

相关问题