반응형

[Java 실습 #14] 파일 입출력(IO) - CSV 파일 데이터를 객체(Object)에 매핑 (2) - commons-csv 활용

 

 

1. CSV 파일 데이터를 객체(Object)에 매핑

2. 개발환경

    2.1. 개발환경

    2.2. 라이브러리

3. 구현

    3.1. 프로젝트 구조

    3.2. 텍스트 파일 - csv 형태

    3.3. 구현 - 소스코드

    3.4. 배포 후 외부 텍스트 파일 저장 확인

4. 결과 화면

    4.1. 편집기 (IDE) 실행

    4.2. jar 배포 후 실행

 

 

1. CSV 파일 데이터를 객체(Object)에 매핑

  • csv 데이터를 매핑하기 위해 User, Gender 생성
  • csv 데이터를 읽기 위한 Dao 생성

 

2. 개발환경

 

2.1. 개발환경

MacOS M1 - macOS Monterey 12.0.1

JDK 1.8

IntelliJ IDEA 2021.2 (Community Edition)

 

2.2. 라이브러리

commons-csv-1.9.0.jar

 

 

3. 구현

 

3.1. 프로젝트 구조

 

3.2. 텍스트 파일 - csv 형태

[ sample-data-commons-csv.txt ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ID, FIRST NAME, LAST NAME, AGE, GENDER, EMAIL, SALARY
=====================================================
1001 , Michael , Jordan, 23, M, michael@tester.com , 30_000_000
1002 , Michelle , Jordan, 24, F, michelle@tester.com , 31_000_000
1003 , Adrian , Grey , 25, M , adrian@tester.com , 32_000_000
1004 , Adriana , Grey , 26, F , adriana@tester.com , 33_000_000
1005 , Harry , Potz , 27 , M , harry@tester.com , 34_000_000
1006 , Harriot , Potz , 28 , F , harriot@tester.com , 35_000_000
1007 , Mary , Granger , 29, F , mary@tester.com , 36_000_000
1008 , Susan , Little , 53 , F , susan@tester.com , 37_000_000
1009 , Peter , Johnson , 30 , M , peter@tester.com , 38_000_000
     1010 , Maria , Storm , 31 , F , maria@tester.com , 39_000_000
1011 , Helen , Hays , 32 , F , helen@tester.com , 40_000_000
1012 , Zeus , Nolan , 33 , M , zeus@tester.com , 41_000_000
1013 , Hector , Wood , 34 , M , hector@tester.com , 42_000_000
1014 , Chris , Munteanu, 35 , M , chris@tester.com , 43_000_000
1015 , Boris , Jackson , 36 , M , boris@tester.com , 44_000_000
1016 , Boris , Johnson , 36 , M , boris@tester.com , 44_000_000
1017 , Jack , Hope , 37 , M , jack@tester.com , 45_000_000
    1018 , Janet , Hope , 37 , M , janet@tester.com , 46_000_000

 

 

3.3. 구현 - 소스 코드

3.3.1 User, Gender 생성

[ User.java ]

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package io.home.test.app.user.model;
 
public class User {
 
    // ID, FIRST NAME, LAST NAME, AGE, GENDER, EMAIL, SALARY
    private long id;
    private String firstName;
    private String lastName;
    private int age;
    private Gender gender;
    private String email;
    private long salary;
 
    public User() {
    }
 
    public User(long id, String firstName, String lastName, int age, Gender gender, String email, long salary) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
        this.gender = gender;
        this.email = email;
        this.salary = salary;
    }
 
    // Getters and Setters
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Gender getGender() {
        return gender;
    }
    public void setGender(Gender gender) {
        this.gender = gender;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public long getSalary() {
        return salary;
    }
    public void setSalary(long salary) {
        this.salary = salary;
    }
 
    @Override
    public String toString() {
//        return toJsonString();
        return toJsonStringBuilder();
    }
 
    public String toJsonString() {
        return "{" +
                "\"id\":" + id +
                ", \"firstName\":\"" + firstName + "\"" +
                ", \"lastName\":\"" + lastName + "\"" +
                ", \"age\":" + age +
                ", \"gender\":\"" + gender + "\"" +
                ", \"email\":\"" + email + "\"" +
                ", \"salary\":" + salary +
                "}";
    }
 
    public String toJsonStringBuilder() {
        StringBuilder sb = new StringBuilder();
        sb.append("{");
        sb.append("\"id\":").append(id).append(",");
        sb.append("\"firstName\":\"").append(firstName).append("\"").append(",");
        sb.append("\"lastName\":\"").append(lastName).append("\"").append(",");
        sb.append("\"age\":").append(age).append(",");
        sb.append("\"gender\":\"").append(gender).append("\"").append(",");
        sb.append("\"email\":\"").append(email).append("\"").append(",");
        sb.append("\"salary\":").append(salary);
        sb.append("}");
        return sb.toString();
    }
 
}
 

 

 

[ Gender.java ]

1
2
3
4
5
package io.home.test.app.user.model;
 
public enum Gender {
    MALE, FEMALE;
}

 

 

3.3.2 csv 데이터를 읽기 위한 DAO 생성

[ UserDaoCommonsCsv.java ]

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
package io.home.test.app.user.dao;
 
import io.home.test.app.user.model.Gender;
import io.home.test.app.user.model.User;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVRecord;
 
import java.io.*;
import java.util.*;
 
public class UserDaoCommonsCsv {
 
    private static final String USER_DATA_PATH = "resource";
    private static final String USER_DATA_FILE_NAME = "sample-data-commons-csv.txt";
    private static LinkedHashMap<Long, User> userMap;
    private List<String> exceptionList;
 
    public UserDaoCommonsCsv() {
        if (userMap == null) readUserData();
    }
 
    public LinkedHashMap<Long, User> getUserMap() {
        return userMap;
    }
 
    public List<String> getExceptionList() {
        return exceptionList;
    }
 
    private void readUserData() {
        String filePath = "/" + USER_DATA_PATH + "/" + USER_DATA_FILE_NAME;
        InputStream is = UserDaoCommonsCsv.class.getResourceAsStream(filePath);
        if (is == null) {
            System.out.println("No data in " + filePath);
            return;
        }
 
        userMap = new LinkedHashMap<>();
        exceptionList = new ArrayList<>();
 
        CSVFormat csvFormat = CSVFormat.DEFAULT.builder()
                .setIgnoreSurroundingSpaces(true)
                .setIgnoreEmptyLines(true)
                .setTrim(true)
                .build();
 
        try (Reader reader = new BufferedReader(new InputStreamReader(is))) {
            Iterable<CSVRecord> records = csvFormat.parse(reader);
            int increment = 0;
            for (CSVRecord record : records) {
                if (++increment < 3continue;
 
                long id = Long.parseLong(record.get(0));
                String firstName = record.get(1);
                String lastName = record.get(2);
                int age = Integer.parseInt(record.get(3));
                Gender gender = record.get(4).startsWith("M") ? Gender.MALE : Gender.FEMALE;
                String email = record.get(5);
                long salary = Long.parseLong(record.get(6).replace("_"""));
 
                userMap.put(id, new User(id, firstName, lastName, age, gender, email, salary));
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
 
}
 

 

 

3.3.3 main method 추가

[ App.java ]

1
2
3
4
5
6
7
8
9
10
11
package io.home.test;
 
import io.home.test.app.user.dao.UserDaoCommonsCsv;
 
public class App {
    public static void main(String[] args) {
       UserDaoCommonsCsv userDao = new UserDaoCommonsCsv();
        System.out.println("USER MAP\n" + userDaoCommonsCsv.getUserMap().toString());
    }
}
 

 

 

 

4. 결과 화면

4.1. 편집기 실행

 

4.2. jar 파일 배포 후 실행

 

4.2.1. jar 파일 배포

[인텔리제이 (IntelliJ) #1] JAR 파일 배포 방법

 

[인텔리제이 (IntelliJ) #1] JAR 파일 배포 방법

[인텔리제이 (IntelliJ) #1] JAR 파일 배포 방법 1. File > Project Structure > Artifacts > + 2. Add > JAR > From modules with dependencies... 3. Create JAR from Modules > Module 지정 > Main Clas..

tlo-developer.tistory.com

 

[인텔리제이 (IntelliJ) #2] JAR 파일 라이브러리 추가하여 배포

 

[인텔리제이 (IntelliJ) #2] JAR 파일 라이브러리 추가하여 배포

[인텔리제이 (IntelliJ) #2] JAR 파일 라이브러리(외부 jar 파일) 추가하여 배포 1. 폴더 (우클릭) > 라이브러리로 지정 2. File > Project Structure > Modules > Dependencies > 라이브러리 체크 3. Libraries >..

tlo-developer.tistory.com

 

 

4.2.2. jar 파일 배포 후 터미널 실행

 

[ 파일 구조 ]

 

[ 터미널 실행 결과화면 ]

 

1
java -jar file-io-csv-to-object.jar

 

반응형