반응형
JSON양식으로 변환
{"resultCode" : 0,"resultMsg" : "SUCCESS","Items" : [{"DATA_SEQ" : 75005,"DATA_CODE" : "A1A1A0","REGION" : "A","SERIESNAME" : "전체","YEAR" : "1998","TOTAL" : 8823,"VALUE" : 25.1,"CI" : "(34.0, 36.2)","MODEL_VALUE" : 34.1,"APC_YEAR" : "1998-2018","APC_VALUE" : -2.1,"APC_CI" : "(-2.4, -1.9)"}]};
이런식의 텍스트가 있고 이것을 JSON 형식으로 맞추어야 했다.
import json
def parse_json_objects(json_string):
# 문자열을 JSON 객체 리스트로 변환
json_objects = json_string.split(';')
parsed_objects = []
for obj_str in json_objects:
if not obj_str.strip():
continue # 빈 문자열 건너뛰기
try:
# JSON 객체를 파싱하고 리스트에 추가
obj_str = obj_str.strip().rstrip(';') # 끝의 세미콜론 제거
obj = json.loads(obj_str)
parsed_objects.append(obj)
except json.JSONDecodeError as e:
print(f"JSON 파싱 오류: {e.msg}, 위치: {e.pos}")
print(f"오류가 발생한 문자열: {obj_str}")
raise # 오류를 발생시켜 처리 중단
return parsed_objects
def main(file_path):
# 파일 읽기
with open(file_path, 'r', encoding='utf-8') as file:
json_string = file.read()
# JSON 문자열 파싱
parsed_json_list = parse_json_objects(json_string)
# 최종 JSON 구조 생성
final_json = {
"resultCode": "00",
"resultMsg": "SUCCESS",
"items": parsed_json_list
}
# JSON을 문자열로 변환하여 출력
print(json.dumps(final_json, ensure_ascii=False, indent=2))
# 스크립트 실행
if __name__ == "__main__":
file_path = 'd:/convert_json.txt'
main(file_path)
물리적으로 분리되어 있는 DB 복사
담당자가 기존에 동일한 서버에서 작업하는거라 그냥 단순 쿼리로 DB를 옮기면 된다고 했지만... 이제 와서 말이 바뀌어 물리적으로 분리가 되어있는 서버라고 한다...
그래서 쿼리로 불가능하여 JAVA에서 Export후 Import하는 방식으로 변경하는 중이다.
private void DatabaseExport() throws Exception {
// 접속정보
String url = "jdbc:mariadb://IP:PORT/DM_NAME";
String user = "ID";
String password = "PASSWORD";
String query = "SELECT * FROM your_table";
// 저장경로를 포함한 파일명
String csvFile = "path/file_name.csv";
// DB커낵션
try (Connection con = DriverManager.getConnection(url, user, password);
Statement st = con.createStatement();
// 쿼리 실행
ResultSet rs = st.executeQuery(query);
FileWriter fw = new FileWriter(csvFile)) {
while (rs.next()) {
// 컬럼 개수만큼 반복
for (int i = 1; i <= 16; i++) {
String data = rs.getString(i);
// null 값 처리
if (data == null) {
// null 값일 때 처리
// 예시로 null로 표시
data = "null";
}
// 데이터에 쉼표가 포함되어 있다면 큰따옴표로 감쌈
if (data.contains(",")) {
data = "\"" + data + "\"";
fw.append(data);
}else {
fw.append(data);
}
// 마지막 열이 아니라면 쉼표 추가
if (i < 16) {
fw.append(",");
}
}
// 다음 행에 기록
fw.append("\n");
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void DatabaseImport() throws Exception {
// import를 진행할 접속정보
String url = "jdbc:mariadb://IP:PORT/DM_NAME";
String user = "ID";
String password = "PASSWORD";
// 경로를 포함한 파일명
String csvFile = "path/file_name.csv";
// 테이블을 삭제하고 다시 생성하는 SQL 명령
String dropTableSql = "DROP TABLE IF EXISTS your_table";
String createTableSql = "CREATE TABLE your_table (column1 TYPE1, column2 TYPE2, ...)";
String insertSql = "INSERT INTO your_table (column1, column2, ...) VALUES (?, ?, ...)";
try (Connection con = DriverManager.getConnection(url, user, password);
Statement stmt = con.createStatement();) {
// 기존 테이블 삭제
stmt.executeUpdate(dropTableSql);
// 새 테이블 생성
stmt.executeUpdate(createTableSql);
// CSV 파일에서 데이터를 읽어서 새 테이블에 삽입
try (PreparedStatement pst = con.prepareStatement(insertSql);
BufferedReader br = new BufferedReader(new FileReader(csvFile));) {
String line;
while ((line = br.readLine()) != null) {
// 큰따옴표로 감싸진 데이터를 올바르게 처리하기 위한 정규식
String[] values = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", -1);
// 모든 필드에 대한 값을 설정
for (int i = 0; i < values.length; i++) {
// 큰따옴표 제거 및 공백 제거
String value = values[i].replace("\"", "").trim();
// 값이 빈 문자열이거나 "null" 문자열인 경우 null로 처리
if (value.isEmpty() || value.equalsIgnoreCase("null")) {
pst.setNull(i + 1, Types.VARCHAR); // 적절한 SQL 타입을 설정
} else {
pst.setString(i + 1, value);
}
}
pst.executeUpdate();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
반응형