Atomic Habits

Java - csv Read 및 그룹별 Row 편집하여 csv 저장 본문

IT/JAVA

Java - csv Read 및 그룹별 Row 편집하여 csv 저장

체계성 2021. 12. 21. 20:40

출처 : https://super1410.tistory.com/18 

 

1. 데이터가 대용량일 경우 csv로 편집하는 것이 메모리 사용량도 적고 좋다.

2. 원하는 row값을 받아 특정 컬럼에 그룹별로 잘라서 CSV파일로 저장한다.

 

@RequestMapping(value="/getDivExcelLib", method = RequestMethod.POST)
      public @ResponseBody int getDivExcelLib(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String path =  "C:/help/";
        String fileName = request.getParameter("excelName");
        String direccion = path+fileName;
        int result = 0;
        //반환용 리스트
        List<List<String>> totalList = new ArrayList<List<String>>();
        BufferedReader br = Files.newBufferedReader(Paths.get(direccion), Charset.forName("UTF-8"));
        
        List<String> valueList = new ArrayList<String>();
        
        try{
            String line = "";
 
            //전체 리스트
            while((line = br.readLine()) != null){
                //CSV 1행을 저장하는 리스트
                String regex = ",";
                int limit = -1;
                String column[] = line.split(regex, limit); //컬럼
                //배열에서 리스트 반환
                if(line.equals("")) {
                    line = " ";
                }
                valueList = Arrays.asList(column);
                totalList.add(valueList);
            }
            br.close();
 
            TreeMap<String, Object> segMap = new TreeMap<String, Object>();
            
            //Seg별 Group 별 행갯수 확인
            int segValue = 0;
            String seg = "";
            for(int i =1; i < totalList.size(); i++) { //첫행을 제외하고 Seg확인
                seg = totalList.get(i).get(0);
                segValue = segValue + (seg.equals(seg) ? 1 : 0);
                segMap.put(seg, segValue);
            }
 
            //seg 그룹 관련
            List<Map<String, Object>> segList = new ArrayList<>(); //seg별 갯수 확인
            int startRow = 0; 
            //각 seg별 seg이름, 시작, 종료 행을 확인한다.
            for(String key : segMap.keySet()) {
                Map<String, Object> segListMap = new LinkedHashMap<>();
                segListMap.put("startRow", startRow + 1);
                startRow = Integer.parseInt(String.valueOf(segMap.get(key))) + 1;
                int endRow = startRow;
                segListMap.put("seq", key);
                segListMap.put("endRow", endRow);
                segList.add(segListMap);
            }
 
            //행 갯수별 전체 리스트에서 csv파일 추출
            //새로만들 sheet
            fileName = fileName.substring(0, fileName.indexOf("."));
            Date now = new Date();
            String cDate = new SimpleDateFormat("yyyyMMddHHmmss").format(now);
            String nfileName = fileName + "_" +  cDate;
            
            for(int i = 0; i < segList.size(); i++) { //seg별 시작row와 종료row확인
                StringBuffer data = new StringBuffer();
                Charset.forName("UTF-8");
                String segName = (String) segList.get(i).get("seq");
                int start = (int) segList.get(i).get("startRow");
                int end = (int) segList.get(i).get("endRow");
                for(int j = start; j < end; j++ ) {
                    if(j == start) { //헤더 삽입
                        for(int k = 1; k < valueList.size(); k++) {
                            data.append(totalList.get(0).get(k) + ",");
                        }
                        data.append('\n');
                    }
                    
                    for(int k = 1; k < valueList.size(); k++) {
                        data.append(totalList.get(j).get(k) + ",");
                    }
                    data.append('\n');                    
                }
                
                path = "C:/help/" + nfileName + "_" +  segName + ".csv";
                FileOutputStream outputStream = new FileOutputStream(path);
                outputStream.write(data.toString().getBytes());
                outputStream.close();
            }
            System.out.println("저장완료 : ");
            result = 1;
            
        }catch(FileNotFoundException e){
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            try{
                if(br != null){
                    br.close();    
                }
            }catch(IOException e){
                e.printStackTrace();
                
            }
        }
        
        return result ;
    }

 

Comments