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

Java 如何获得csv文件中每个字段的最大长度?,java,csv,Java,Csv,我需要找出csv文件中每个字段的最大长度 例如,在以下cvs文件中,因为 1) var1具有最长的字符串shj,即3个字符 2) var2具有最长的字符串asdf-4个字符 3) var3具有asddfs-6个字符 var1,var2,var3 a,asdf,df aa,, shj,,asddfs 因此,我需要的结果是数组int[]maxLength={3,4,6} 到目前为止,我使用的是CSV阅读器API。这是我的密码 CSVReader reader = new CSVReader (n

我需要找出csv文件中每个字段的最大长度

例如,在以下
cvs
文件中,因为 1)
var1
具有最长的字符串
shj
,即3个字符

2)
var2
具有最长的字符串
asdf
-4个字符

3)
var3
具有
asddfs
-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(); 
CSVReader reader=newcsvreader(newfilereader(Looks.fileName));
int[]maxLength=new int[reader.readNext().length];
for(int i=0;i
它很好用。但是对于一个大文件来说太慢了。我有大约100000000行


有什么有效的方法可以做到这一点吗?我是否可以使用
setascistream
更有效地估计长度?

是否缓冲
CSVReader
?如果没有,请使用
BufferedReader
文件读取器
包装起来(并使其成为一个非常大的缓冲区大小)。

是否缓冲了
CSVReader
?如果没有,请使用
BufferedReader
文件读取器
包装起来(并使其成为一个非常大的缓冲区大小)。

是否缓冲了
CSVReader
?如果没有,请使用
BufferedReader
文件读取器
包装起来(并使其成为一个非常大的缓冲区大小)。

是否缓冲了
CSVReader
?如果没有,请使用
BufferedReader
文件读取器
包装起来(并使其成为一个非常大的缓冲区大小)。

您的代码几乎是尽可能高效的—它只读取一次每个字节,并且不会对文件进行任何昂贵的查找

文件读取器
包装在
缓冲读取器
中可能会提高性能,尽管
CSVReader
在内部使用
缓冲读取器
的可能性不大

从磁盘读取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的源代码:

CSVReader
的构造函数将
读取器
包装在
BufferedReader
中(如果它还不是
BufferedReader

CSVReader.readNext()
只需重复调用
BufferedReader.readLine()
,并以这种方式对字符进行一些非常基本的操作

这是读取文件的最快方式:从头开始,一直读到最后,使用缓冲区,以便底层磁盘读取的大小符合硬件和设备驱动程序的喜好

在一个大文件上运行上面的程序,你会发现它花费的时间与你的CSV解析程序差不多——因为即使我的程序没有做任何明显的处理,它也和你的程序有同样的瓶颈——从磁盘读取的速度

实际上,
cat-largefile>/dev/null
(UNIX)或
type-largefile>NUL
将花费类似的时间

使用探查器运行代码,您会发现它比其他任何地方花费更多的时间等待
read()
(在核心Java的本地方法中)


您不能对Java程序做任何事情来加快速度。您可以通过调整硬件和/或操作系统来提高速度,比如调整文件系统参数和驱动程序设置,将文件放在RAMdisk或SSD上,等等

您的代码几乎是尽可能高效的—它只读取每个字节一次,而且不会对文件进行任何昂贵的查找

文件读取器
包装在
缓冲读取器
中可能会提高性能,尽管
CSVReader
在内部使用
缓冲读取器
的可能性不大

从磁盘读取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的源代码:

CSVReader
的构造函数将
读取器
包装在
BufferedReader
中(如果它还不是
BufferedReader

CSVReader.readNext()
只需重复调用
BufferedReader.readLine()
,并以这种方式对字符进行一些非常基本的操作

这是读取文件的最快方式:从头开始,一直读到最后,使用缓冲区,以便底层磁盘读取的大小符合硬件和设备驱动程序的喜好

在一个大文件上运行上面的程序,你会发现它花费的时间与你的CSV解析程序差不多——因为即使我的程序没有做任何明显的处理,它也和你的程序有同样的瓶颈——从磁盘读取的速度

实际上,
cat-largefile>/dev/null
(UNIX)或
type-largefile>NUL
将花费类似的时间

使用探查器运行代码,您会发现它比其他任何地方花费更多的时间等待
read()
(在核心Java的本地方法中)

你什么都做不了