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 ;
}