Ich habe eine Spring MVC-App mit Datei-Upload-Funktion. Dateien werden als MultipartFile an den Controller übergeben, von dem es leicht ist, einen InputStream zu erhalten. Ich lade zip-Dateien hoch, die CSVs enthalten, und ich habe Schwierigkeiten, eine Möglichkeit zu finden, die CSVs zu öffnen und sie Zeile für Zeile zu lesen. Es gibt viele Beispiele über das "Lesen in einen Puffer fester Größe". Ich habe dies versucht, aber die Puffer verketten nicht sehr gut und es wird bald nicht mehr synchron und verwendet viel Speicher:Lesen von CSVs aus einer Zip-Datei Zeile für Zeile
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();
}
Es muss einen besseren Weg geben, die tatsächlich funktioniert.
Der Jackson CsvMapper analysiert einen Eingabestream Zeile für Zeile in ein Objekt []. Könnte einen Blick wert sein. Es wird schneller als Split (",") und umgehen Sie auch entkommen. – tom