Allen's 데이터 맛집

[4] Java를 사용한 CSV 데이터 분석 및 정렬. SortInformation 본문

etc Project/범죄 데이터 간단한 분석

[4] Java를 사용한 CSV 데이터 분석 및 정렬. SortInformation

Allen93 2024. 9. 8. 11:25
Java를 사용하여 CSV 데이터를 읽고, 분석하며, 정렬해보겠습니다. 특히, SortInformation 클래스를 사용하여 범죄 통계 데이터를 처리해보겠습니다. 이 클래스는 CSV 파일에서 데이터를 읽어와 필요한 값을 변환하고, 이를 바탕으로 통계 정보를 도출하여 정렬합니다.

 

 

SortInformation 클래스

 

아래는 SortInformation 클래스의 전체 코드입니다. 이 코드는 CSV 파일을 읽어 데이터를 2차원 배열에 저장하고, 특정 통계 정보를 계산한 후, 이를 정렬하여 출력합니다.

import java.io.*;
import java.util.*;

public class SortInformation {
    public static void main(String[] args) {
        String[][] category = new String[50][20];
        double[][] csVal = new double[50][20];

        try {
            File csv = new File("D:\\Crime.csv");
            BufferedReader br = new BufferedReader(new FileReader(csv));
            String line = "";
            int row = 0;
            int col = 0;

            while ((line = br.readLine()) != null) {
                String[] token = line.split(",");
                for (col = 0; col < 15; col++) {
                    category[row][col] = (token[col]);
                    String str = category[row][col];
                    str = str.replaceAll("\\-", "0");
                    category[row][col] = str;
                }
                row++;
            }

            for (int selectRow = 1; selectRow < 39; selectRow++) {
                for (int column = 2; column < 4; column++) {
                    int value = Integer.parseInt(category[selectRow][column]);
                    csVal[selectRow][column] = value;
                }
            }
            
            Map<String, Integer> map = new HashMap<>();
            double result;
            for (int calRow = 1; calRow < 39; calRow++) {
                result = csVal[calRow][3] / csVal[calRow][2] * 100;
                map.put(category[calRow][1], (int) result);
            }

            List<Map.Entry<String, Integer>> list = new LinkedList<>(map.entrySet());

            Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
                @Override
                public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                    int comparision = (o1.getValue() - o2.getValue()) * -1;
                    return comparision == 0 ? o1.getKey().compareTo(o2.getKey()) : comparision;
                }
            });
            System.out.println(list);

            br.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

 

코드 설명

  1. 변수 초기화 및 CSV 파일 읽기:
String[][] category = new String[50][20];
double[][] csVal = new double[50][20];

try {
    File csv = new File("D:\\Crime.csv");
    BufferedReader br = new BufferedReader(new FileReader(csv));
    String line = "";
    int row = 0;
    int col = 0;

    while ((line = br.readLine()) != null) {
        String[] token = line.split(",");
        for (col = 0; col < 15; col++) {
            category[row][col] = (token[col]);
            String str = category[row][col];
            str = str.replaceAll("\\-", "0");
            category[row][col] = str;
        }
        row++;
    }

 

  • category 배열은 CSV 파일에서 읽어온 문자열 데이터를 저장합니다.
  • csVal 배열은 문자열 데이터를 정수로 변환한 값을 저장합니다.
  • CSV 파일을 읽어와 BufferedReader 객체를 사용하여 각 줄을 읽습니다.
  • 각 줄을 쉼표(,)로 분리하여 category 배열에 저장합니다.
  • 값이 없는 경우(-)를 0으로 대체합니다.

 

2. 데이터 변환:

for (int selectRow = 1; selectRow < 39; selectRow++) {
    for (int column = 2; column < 4; column++) {
        int value = Integer.parseInt(category[selectRow][column]);
        csVal[selectRow][column] = value;
    }
}

 

 

  • category 배열의 문자열 데이터를 정수로 변환하여 csVal 배열에 저장합니다.

 

3. 통계 정보 계산 및 HashMap에 저장:

Map<String, Integer> map = new HashMap<>();
double result;
for (int calRow = 1; calRow < 39; calRow++) {
    result = csVal[calRow][3] / csVal[calRow][2] * 100;
    map.put(category[calRow][1], (int) result);
}

 

 

  • csVal 배열의 값을 사용하여 특정 통계 정보를 계산합니다.
  • 각 범죄 유형에 대한 결과 값을 HashMap에 저장합니다.

4. HashMap 정렬 및 출력:

List<Map.Entry<String, Integer>> list = new LinkedList<>(map.entrySet());

Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
    @Override
    public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
        int comparision = (o1.getValue() - o2.getValue()) * -1;
        return comparision == 0 ? o1.getKey().compareTo(o2.getKey()) : comparision;
    }
});
System.out.println(list);

 

 

  • HashMap의 엔트리를 LinkedList로 변환하여 정렬합니다.
  • 정렬된 결과를 출력합니다.

 

5. 예외 처리:

catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

 

파일을 읽는 도중 발생할 수 있는 예외를 처리합니다.


https://github.com/siilver94/Analyze-Data-in-CSV

 

GitHub - siilver94/Analyze-Data-in-CSV

Contribute to siilver94/Analyze-Data-in-CSV development by creating an account on GitHub.

github.com

 

 

728x90