我在csvWriter(Java)的帮助下编写csv文件,但在Unix Box上执行带有大量记录(大约9000)的代码时,它会创建空文件。 当我尝试在Windows上的本地(Eclipse)执行相同的代码时,它适用于相同的大文件。为什么?
我注意到一件事,如果记录大约是3000,那么它也可以在unix框中正常工作。
问题只有大文件。
我也尝试使用writer.writeNext()方法而不是writeAll(),但在UNIX Box中仍然遇到同样的问题。 :( 注意:文件没有任何特殊字符,它是英文的。
代码 - >
CSVReader reader = new CSVReader(new FileReader(inputFile), ',','"');
List<String[]> csvBody = reader.readAll();
int listSize = csvBody.size();
if(listSize > 0){
String renameFileNamePath = outputFolder + "//"+ existingFileName.replaceFirst("file1", "file2");
File newFile = new File(renameFileNamePath);
CSVWriter writer = new CSVWriter(new FileWriter(newFile), ',');
for(int row=1 ; row < listSize; row++){
String timeKeyOrTransactionDate = null;
timeKeyOrTransactionDate = year+"-"+month+"-"+day+" 00:00:00";
csvBody.get(row)[0] = timeKeyOrTransactionDate ;
}
//Write to CSV file which is open
writer.writeAll(csvBody);
writer.flush();
writer.close();
}
reader.close();
答案 0 :(得分:2)
readAll和writeAll方法只应与小数据集一起使用 - 否则就像瘟疫一样避免使用它。请改用readNext和writeNext方法,这样就不必将整个文件读入内存。
请注意,一旦您没有更多数据(Stream结束或文件结束),readNext将返回null。我将不得不更新javadocs来提及。
免责声明 - 我是opencsv项目的维护者。所以请认真对待“避免瘟疫”。真的只是放在那里因为大多数文件通常都很小并且可以放在内存中,但是如果怀疑数据集有多大会避免将它全部放在内存中。
答案 1 :(得分:0)
数据错误。 Linux机器可能使用UTF-8 Unicode编码。这可能会在第一个遇到格式错误的UTF-8字节序列时抛出错误,单字节Windows编码只接受。
您正在使用旧的实用程序类FileWriter
(也存在缺陷的Charset charset = Charset.forName("Windows-1252"); // Windows Latin-1
),它使用默认的平台编码,这使得软件平台依赖。
你需要这样做:
BufferedReader br = Files.newBufferedReader(inputFile.toPath(), charset);
阅读
Path newFile = Paths.get(renameFileNamePath);
BufferedWriter bw = Files.newBufferedWriter(newFile, charset);
CSVWriter writer = new CSVWriter(bw, ',');
写作
<groupId>this.that</groupId>
<artifactId>build.root</artifactId>
<name>A name</name>
<packaging>pom</packaging>
<modules>
<module>../a.b</module>
<module>../a.c</module>
以上假设采用单字节编码,但也可能适用于大多数其他单字节编码。
遗憾的是该文件不是UTF-8,允许任何脚本。
答案 2 :(得分:0)
问题已经解决。实际上输出目录也是通过加载器应用程序共享的,并且加载器在每分钟都保持检查文件,这就是为什么在编写csv文件之前,加载器选择它并在DB中加载零kb。 因此我使用缓冲编写器而不是文件编写器,并且首先在tmp文件中写入数据,然后用file2重命名它并且它工作。
感谢各位的帮助和宝贵的建议。