[데이터 가공] 기상청 지역 데이터 가공( 간단한 자바프로그램을 이용해 )

SeoYehJoon·2024년 10월 5일
0

웹 개인공부

목록 보기
19/22









기상청 지역 데이터.xlsx


현재 보이는 표는 기상청에서 제공하는 자료이다 위 데이터를 이용해서 3가지의 주소를 선택하면 x,y값을 전달하게 돼있다. 그러기 위해서 어떻게 가공을 해야하는지 먼저 결과를 보여주겠다.






output.json ( 위 .xlsx 파일 가공결과 )


위 json 데이터에서
ex) 울산광역시의 x, y 값은102, 84이다.
ex) 울산광역시 중구의 x, y 값은 102, 84이다.
ex) 울산광역시 중구 병영2동의 x, y 값은 102, 85이다.






data.txt , DataTransformer.java

먼저 .xlsx 파일에서 필요한 열만 따와보자

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class DataTransformer {
    public static void main(String[] args) {
        String inputFile = "data.txt";
        String outputFile = "output.json";
        
        Map<String, Map<String, Map<String, Map<String, Integer>>>> data = new HashMap<>();
        
        try (BufferedReader br = new BufferedReader(new FileReader(inputFile, StandardCharsets.UTF_8))) {
            String line;
            while ((line = br.readLine()) != null) {
                String[] parts = line.split("\t");
                String city = parts[0];
                String district = parts.length > 1 ? parts[1] : "";
                String subdistrict = parts.length > 2 ? parts[2] : "";
                int x = Integer.parseInt(parts[parts.length - 2]);
                int y = Integer.parseInt(parts[parts.length - 1]);
                
                data.computeIfAbsent(city, k -> new HashMap<>())
                    .computeIfAbsent(district, k -> new HashMap<>())
                    .put(subdistrict, Map.of("x", x, "y", y));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        try (FileWriter writer = new FileWriter(outputFile, StandardCharsets.UTF_8)) {
            writer.write("{\n");
            for (String city : data.keySet()) {
                writer.write("  \"" + city + "\": {\n");
                Map<String, Map<String, Map<String, Integer>>> districts = data.get(city);
                for (String district : districts.keySet()) {
                    writer.write("    \"" + district + "\": {\n");
                    Map<String, Map<String, Integer>> subdistricts = districts.get(district);
                    for (String subdistrict : subdistricts.keySet()) {
                        Map<String, Integer> coordinates = subdistricts.get(subdistrict);
                        writer.write("      \"" + subdistrict + "\": {\"x\": " + coordinates.get("x") + ", \"y\": " + coordinates.get("y") + "}");
                        if (!subdistrict.equals(subdistricts.keySet().toArray()[subdistricts.size() - 1])) {
                            writer.write(",");
                        }
                        writer.write("\n");
                    }
                    writer.write("    }");
                    if (!district.equals(districts.keySet().toArray()[districts.size() - 1])) {
                        writer.write(",");
                    }
                    writer.write("\n");
                }
                writer.write("  }");
                if (!city.equals(data.keySet().toArray()[data.size() - 1])) {
                    writer.write(",");
                }
                writer.write("\n");
            }
            writer.write("}\n");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

위 두코드를 한폴더에 넣은뒤에 윈도우 명령창을 띄우고 자바프로그램 컴파일(javac DataTransformer.java) 후 실행해준다(java 클래스네임)


그럼 그 결과로 실제 프로그래밍에 쓰일 output.json 파일이 생성된다.

https://velog.io/@holy38/%EB%82%A0%EC%94%A8-%EC%A7%80%EC%97%AD%EC%84%A0%ED%83%9D-%EC%B6%94%EA%B0%80
날씨 지역추가 기능 설명글 여기에서 쓸 json파일이다.

profile
책, 블로그 내용을 그대로 재정리하는 것은 가장 효율적인 시간 낭비 방법이다. 벨로그에 글을 쓸때는 직접 문제를 해결한 과정을 스크린샷을 이용해 정리하거나, 개념을 정리할때는 최소2,3개소스에서 이해한 지식을 정리한다.

0개의 댓글