ファイルアップロード機能を備えたSpring MVCアプリケーションがあります。ファイルは、InputStreamを簡単に取得できるMultipartFileとしてコントローラに渡されます。私はCSVを含むzipファイルをアップロードしています。私は、CSVを開いて一度に1行ずつ読む方法を見つけるのに苦労しています。固定サイズのバッファに読み込むネットにはたくさんの例があります。私はこれを試してみたが、バッファが非常にうまく連結していないと、それはすぐに同期しなくなると、大量のメモリを使用しています。一度にzipファイルからCSVを読み込む
ZipEntry entry = input.getNextEntry();
while(entry != null)
{
if (entry.getName().matches("Data/CSV/[a-z]{0,1}[a-z]{0,1}.csv"))
{
final String fullPath = entry.getName();
final String filename = fullPath.substring(fullPath.lastIndexOf('/') + 1);
visitor.startFile(filename);
final StringBuilder fileContent = new StringBuilder();
final byte[] buffer = new byte[1024];
while (input.read(buffer) > 0)
fileContent.append(new String(buffer));
final String[] lines = fileContent.toString().split("\n");
for(String line : lines)
{
final String[] columns = line.split(",");
final String postcode = columns[0].replace(" ", "").replace("\"", "");
if (columns.length > 3)
visitor.location(postcode, "", "");
}
visitor.endFile();
}
entry = input.getNextEntry();
}
は実際に動作し、より良い方法があるに違いありません。
Jackson CsvMapperは入力ストリームを一度に1行ずつObject []に解析します。一見の価値があるかもしれません。それはスプリット( "、")より速くなり、エスケープも処理されます。 – tom