Java 如何获得csv文件中每个字段的最大长度?
我需要找出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
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的本地方法中)
你什么都做不了