Tôi đã có ứng dụng Spring MVC với khả năng tải tệp lên. Các tệp được truyền tới bộ điều khiển dưới dạng MultipartFile, từ đó dễ dàng nhận được một InputStream. Tôi đang tải lên các tệp zip chứa CSV và tôi đang cố gắng tìm cách mở CSV và đọc từng dòng một. Có rất nhiều ví dụ trên 'net đọc vào một bộ đệm kích thước cố định. Tôi đã thử điều này, nhưng các bộ đệm không tiếp nhau rất tốt và nó sớm được ra khỏi đồng bộ và sử dụng rất nhiều bộ nhớ:Đọc CSV từ một tệp zip tại một thời điểm
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();
}
Có phải là một cách tốt hơn mà thực sự hoạt động.
Jackson CsvMapper sẽ phân tích một dòng đầu vào tại một thời điểm thành một đối tượng []. Có thể là một giá trị. Nó sẽ nhanh hơn chia (",") và xử lý thoát quá. – tom