[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 < 3) continue;
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) #2] JAR 파일 라이브러리 추가하여 배포
4.2.2. jar 파일 배포 후 터미널 실행
[ 파일 구조 ]
[ 터미널 실행 결과화면 ]
1
|
java -jar file-io-csv-to-object.jar
|
'JAVA 자바 > JAVA 실습' 카테고리의 다른 글
[Java 실습 #16] 마지막 구분자 뒤의 문자열 추출 (0) | 2021.12.26 |
---|---|
[Java 실습 #15] 배열 출력하기 (0) | 2021.12.26 |
[Java 실습 #14] 파일 입출력(IO) - CSV 파일 데이터를 객체(Object)에 매핑 (1) - String.split 활용 (0) | 2021.12.15 |
[Java 실습 #13] 파일 입출력(IO) - 파일 경로 찾기 ClassLoader 활용 (2) - jar 배포 후 jar파일 내부의 텍스트 파일 읽기 (0) | 2021.12.15 |
[Java 실습 #13] 파일 입출력(IO) - 파일 경로 찾기 ClassLoader 활용 (1) - 편집기(IDE)에서 실행 (0) | 2021.12.15 |