728x90
작업 전, 정리하기
자바에서 2021_인구관련연간자료_20221006_45659.csv파일을 읽는다.읽은 파일의 내용 중 전출, 전입 코드 분석하여 split을 한 뒤 Class에 저장한다.생산자에 대입된 Class의 정보를 txt파일로 저장한다.- 저장된 txt파일을 읽은 뒤 차트 양식에 맞춰서 데이터를 수정한다.
- 수정된 데이터에 원하는 정보 값(지역별 인구 이동 결과)을 얻기 위한 가공을 시작한다.
- 가공된 정보를 차트 양식에 맞춰 txt 파일로 추출한다.
- 추출한 값을 차트 양식에 대입한다.
1. 저장된 txt 파일을 읽고 차트 양식에 맞춰서 데이터를 저장
public class PopulationStatistics {
public static void main(String[] args) throws IOException {
...
// $$(전출코드), $$(전입코드)를 heat맵 형식에 맞게 수정
fileAddress = "P:\\Study\\BootSpring\\TIL\\likelion_adu\\src\\file\\mdis\\splitData.txt";
pml = ps.readByLineForHeatmap(fileAddress);
Map<String, Integer> map = ps.getMoveCntMap(pml);
Map<String, Integer> heatmapIdxMap = ps.heatmapIdxMap();
// + 전입 전출한 숫자 증가자료 포함하여 다시 추출
String targetFilename = "for_heatmap.txt";
ps.createFile(targetFilename);
List<String> cntResult = new ArrayList<>();
for (String key : map.keySet()) {
String[] fromto = key.split(",");
// 매핑 후 저장
String s = String.format("[%s, %s, %d] ,", heatmapIdxMap.get(fromto[0]), heatmapIdxMap.get(fromto[1]), map.get(key));
cntResult.add(s);
}
ps.write(cntResult, targetFilename);
}
}
- 대용량 데이터 분석 - 2에서 가공한 txt 파일을 불러옵니다.
- 불러온 데이터를 readByLineForHeatmap 메서드를 사용하여 읽고 heatmap형식에 사용할 수 있도록 다시 parsing 합니다
- 해당 과정은 끊어서 진행하므로 새로운 메서드를 작성하였으나, 이전에 만들어 놓은 메서드를 사용하여 한 번에 진행할 수 있을 것으로 보여 해당 과정 게시물을 다 올린 뒤 리팩터링 하여 추가 메서드 없이 한 번에 과정이 이뤄질 수 있도록 수정해볼 예정입니다.
- 해당 과정은 끊어서 진행하므로 새로운 메서드를 작성하였으나, 이전에 만들어 놓은 메서드를 사용하여 한 번에 진행할 수 있을 것으로 보여 해당 과정 게시물을 다 올린 뒤 리팩터링 하여 추가 메서드 없이 한 번에 과정이 이뤄질 수 있도록 수정해볼 예정입니다.
- Map을 생성하고, getMoveCntMap을 활용하여 전출 -> 전입 횟수를 증가시켜 데이터를 저장합니다.
- Map을 생성하고 heatmapIdxMap을 사용하여 heatmap 차트에서 사용하는 양식에 맞춰 데이터를 가공합니다.
- heatmap 양식에 맞는 데이터를 저장할 파일 경로, 파일명을 targetFilename 스트링 변수에 저장합니다.
- targetFilename을 기반으로 파일을 생성합니다.
- 데이터 가공 결과를 추출 전 저장할 ArrayList를 생성합니다.
- HashMap에 담긴 결괏값들을 추출하기 위해 map.keySet() 메서드를 사용하여 반복문을 진행합니다.
- 가져온 키 값을 콤마(", ")로 분할하여 fromto String배열에 저장합니다.
- heatmapIdxMap을 사용하여 heatmap양식 지역 코드를 받고, count 된 값을 String 변수에 저장합니다.
- 입력된 데이터를 갖고 있는 변수 s를 ArrayList인 cntReulst에 저장합니다.
- cntResult의 값을 targetFilename에 저장하고 txt 파일로 디스크에 저장합니다.
1) readByLineForHeatmap
1-1) readyByLineForHeatmap(String filename)
public List<PopulationMove> readByLineForHeatmap(String filename) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(filename));
String str;
List<PopulationMove> pml = new ArrayList<>();
while ((str = br.readLine()) != null) {
PopulationMove pm = parseForHeatmap(str);
pml.add(pm);
}
return pml;
}
- 매개변수로 filename을 받고 bufferedreader를 생성합니다.
- 이제 BufferedReader가 filename에 적혀있는 파일을 읽어옵니다.
- 파일로부터 읽어온 값을 저장하기 위한 String변수 str을 생성했습니다.
- PopulationMove 자료형을 가진 List pml을 ArrayList로 생성하였습니다.
- while 반복문을 사용하였습니다. 조건은 str에 readLine()으로 한 줄을 불러오고, 불러온 값이 null이 아니면 계속 반복하는 조건입니다.
- str에 저장된 파일의 정보를 parse 메서드를 사용하여 PopulationMove 자료형 변수에 저장하였습니다.
- 잘 생성된 PopulationMove pm을 어레이 리스트 pml에 추가합니다.
- 해당 메서드는 리팩터링 시 사라질 메서드입니다
1-2) parseForHeatmap
public PopulationMove parseForHeatmap(String data) {
String str[] = data.split(",");
int fromSido = Integer.parseInt(str[0]);
int toSido = Integer.parseInt(str[1]);
PopulationMove pm = new PopulationMove(fromSido, toSido);
return pm;
}
- 읽어온 데이터를 콤마(", ")를 기준으로 분할합니다.
- 이전 데이터와 달리 0번째, 1번째 배열에 해당되는 정보를 갖고 있으므로 배열 인덱스를 입력 후 데이터를 변수에 대입합니다.
- 대입된 변수를 사용하여 객체를 생성합니다.
- 해당 메서드는 리팩터링 시 사라질 메서드입니다
2) getMoveCntMap(List<PopulationMove> populationMoveList)
public Map<String, Integer> getMoveCntMap(List<PopulationMove> populationMoveList) {
Map<String, Integer> moveCntMap = new HashMap<>();
for (PopulationMove pm : populationMoveList) {
String key = pm.getFromSido() + "," + pm.getToSido();
if (moveCntMap.get(key) == null) {
moveCntMap.put(key, 1);
} else {
moveCntMap.put(key, moveCntMap.get(key) + 1);
}
}
return moveCntMap;
}
- 전입, 전출에 대한 카운팅을 해줄 맵, moveCntMap을 해시 맵으로 생성합니다.
- 입력받은 List<PopulationMove> populationMoveList를 향상된 for문으로 List에 저장된 객체를 하나씩 꺼내옵니다.
- "전출" + ", " + "전입"을 저장할 String 변수 key를 생성합니다.
- String변수 Key에 있는 값이 해시맵 moveCntMap의 키로 존재하지 않는다면 moveCntMap의 키로 사용하며 밸류 값으로 1을 지정합니다.
- 키가 존재하고 있다면 기존 밸류 값에 +1을 합니다.
- 반복문이 종료되면 moveCntMap을 반환합니다.
3) heatmapIdxMap()
public Map<String, Integer> heatmapIdxMap() {
Map<String, Integer> map = new HashMap<>();
map.put("11", 0);
map.put("26", 1);
map.put("27", 2);
map.put("28", 3);
map.put("29", 4);
map.put("30", 5);
map.put("31", 6);
map.put("36", 7);
map.put("41", 8);
map.put("42", 9);
map.put("43", 10);
map.put("44", 11);
map.put("45", 12);
map.put("46", 13);
map.put("47", 14);
map.put("48", 15);
map.put("50", 16);
return map;
}
- 각 지역 코드에 대한 값을 키로 지정하고, heatmap에서 원하는 양식대로 숫자를 오름차순으로 지정하여 밸류 값을 지정합니다.
- 키와 밸류를 입력한 map을 반환합니다.
- heatmapIdxMap.get(fromto[0])와 같은 명령어가 있을 때 fromto[0] = 11이라고 가정한다면, 0을 반환합니다.
반응형
'회고록 > Archive' 카테고리의 다른 글
docs: 멋쟁이 사자처럼 백앤드 스쿨 2기 수업 일지 READ ME(2022-11-13) (7) | 2022.11.13 |
---|---|
[Java] 대용량 데이터 분석 - 4 (대한민국 인구 유동(전입, 전출) 데이터 분석 & 처리) (0) | 2022.10.11 |
[Java] 대용량 데이터 분석 - 2 (0) | 2022.10.10 |
[Java] 대용량 데이터 분석 - 1 (0) | 2022.10.10 |
[Java] 대용량 데이터 분석 - 0 (0) | 2022.10.10 |