2013-11-04 6 views
5

파일 업로드 기능이있는 Spring MVC 애플리케이션이 있습니다. 파일은 InputStream을 쉽게 얻을 수있는 MultipartFile로 컨트롤러에 전달됩니다. CSV가 포함 된 zip 파일을 업로드하고 있으며 CSV를 열고 한 번에 한 줄씩 읽을 수있는 방법을 찾으려고 애 쓰고 있습니다. 고정 크기 버퍼로 읽는 방법에 대한 많은 예제가 있습니다. 나는이 시도했지만, 버퍼 아주 잘 연결하여하지 않고 곧 동기화 얻고 메모리를 많이 사용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(); 
     } 

실제로 작동하는 더 나은 방법이 있어야합니다.

+1

:

귀하의 케이스를 들어
CSVReader reader = new CSVReader(new FileReader("yourfile.csv")); String [] nextLine; while ((nextLine = reader.readNext()) != null) { // nextLine[] is an array of values from the line System.out.println(nextLine[0] + nextLine[1] + "etc..."); } 

는 당신이 필요로하는 모든은 버퍼 리더에 압축 파일 스트림을 포장하고 독자를 패스 CSVReader을 작성하고 그것을 사용하는 것입니다 Jackson CsvMapper는 입력 스트림을 한 번에 한 줄씩 Object []로 파싱합니다. 좀 봐봐. 그것은 split (",")보다 빠르며 빠져 나올 수 있습니다. – tom

답변

6

필요에 맞지 않지만 opencsv (http://opencsv.sourceforge.net)를 사용해 보셨습니까? 이들의 예는 정말 직관적이다 :

FileInputStream fis = new FileInputStream(file); 
GZIPInputStream gis = new GZIPInputStream(fis); 
InputStreamReader isr = new InputStreamReader(gis); 
BufferedReader br = new BufferedReader(isr); 
CSVReader reader = new CSVReader(br); 
1

편리한 readLine() 방법을 포함하는 BufferedReader을 사용할 수 있으며 파일의 전체 내용을 메모리에로드하지 마십시오.

BufferedReader in = new BufferedReader(new InputStreamReader(input), 1024); 
String line=null; 
while((line=br.readLine())!=null) { 
    String[] columns = line.split(","); 
    //rest of your code 
} 
+0

ZipEntry에 대한 InputStream을 가져올 수 없으므로 작동하지 않습니다. –

+1

'input' 변수가'ZipInputStream'입니까? 만약 그렇다면 위 코드는'ZipInputStream'이 현재'ZipEntry'에 대한'InputStream'이므로 잘되어야합니다. – samlewis

관련 문제