gimmickbutreal

[JAVA/CSV] Java로 csv 파일 데이터 변경하기 본문

Programming

[JAVA/CSV] Java로 csv 파일 데이터 변경하기

isshosng 2023. 10. 6. 11:43
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import org.apache.commons.csv.*;
import java.io.*;
import java.util.*;
 
public class CSVUpdaterAndSorter {
    public static void main(String[] args) {
        try {
            // 입력 CSV 파일 경로
            String inputFilePath = "C:\\Users\\input.csv";
 
            // 출력 CSV 파일 경로 (새로운 파일로 저장)
            String outputFilePath = "C:\\Users\\output.csv";
 
            // 새로운 데이터 생성
            String[] newData = {"용현동꿀돼지""purehug@hanmail.net""양재동""IT팀""용현동꿀돼지/IT팀<purehug@hanmail.net>"};
            
            // 삭제할 데이터의 이름
            String nameToDelete = "혜화동꿀돼지";
 
            // 파일을 CP949로 읽기 위해 Reader를 생성
            Reader reader = new InputStreamReader(new FileInputStream(inputFilePath), "CP949");
 
            // 파일을 CP949로 쓰기 위해 Writer를 생성
            Writer writer = new OutputStreamWriter(new FileOutputStream(outputFilePath), "CP949");
 
            // 기존 데이터를 불러옴
            CSVParser csvParser = CSVFormat.DEFAULT
                .withFirstRecordAsHeader()
                .withIgnoreEmptyLines(true)
                .withIgnoreSurroundingSpaces()
                .parse(reader);
 
            // 기존 데이터를 리스트에 복사
            List<CSVRecord> records = new ArrayList<>(csvParser.getRecords());
 
            // 이름 열을 기준으로 정렬
            records.sort(Comparator.comparing(record -> record.get("이름")));
 
            // 새로운 데이터를 CSV 파일에 추가
            CSVFormat csvFormat = CSVFormat.DEFAULT
                .withHeader(csvParser.getHeaderMap().keySet().toArray(new String[0]))
                .withRecordSeparator('\n');  // 개행 문자를 '\n'으로 설정
 
            // 새로운 데이터 추가
            CSVPrinter csvPrinter = new CSVPrinter(writer, csvFormat);
 
            // 기존 데이터 출력 (삭제할 이름을 가진 행은 제외)
            for (CSVRecord record : records) {
                if (!record.get("이름").equals(nameToDelete)) {
                    csvPrinter.printRecord(record);
                }
            }
 
            // 새로운 데이터 추가
            csvPrinter.printRecord(Arrays.asList(newData));
            csvPrinter.flush();
            csvPrinter.close();
 
            // 리소스를 닫음
            csvParser.close();
            writer.close();
 
            System.out.println("새로운 데이터가 새 파일에 추가되고 이름순으로 정렬되었습니다. (신규 데이터 예)");
 
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 
cs

 

생각보다 공공기관이나 회사에서 인코딩을 CP949 형식으로 쓰는 경우가 많은데, 이 인코딩 형식의 엑셀 파일(csv)을 수정하고 새로운 파일을 생성하는 코드이다. 

 

유의할 점

1. 본인은 이클립스를 사용했는데, 관리자 권한으로 실행해야 오류가 적게 일어난다.

2. DRM에 걸려있는 파일은 접근이 불가능하며, 이클립스로 생성된 파일은 DRM이 적용되어 있지 않다.

3. 엑셀 파일을 다룰 때 인코딩은 매우 중요하니 파일이 UTF-8인지, ANSI인지, UNIX/WINDOWS 등등 모든 걸 꼼꼼히 확인해야 한다.

 

반응형