Allen's 데이터 맛집

[3] Java를 사용한 CSV 파일 데이터 분석 본문

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

[3] Java를 사용한 CSV 파일 데이터 분석

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

 

 

GetInfoFromCSV 클래스

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

 

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

public class GetInfoFromCSV {

    public static void main(String[] args) {
        String[][] dataArray = new String[50][20];
        double[][] csvVal = new double[50][20];

        try {
            File csv = new File("D:\\Crime2014.csv");
            BufferedReader bReader = new BufferedReader(new FileReader(csv));
            String line = "";
            int row = 0;
            int column = 0;

            while ((line = bReader.readLine()) != null) {
                String[] token = line.split(",");
                for (column = 0; column < 15; column++) {
                    dataArray[row][column] = (token[column]);
                    String strForBlank = dataArray[row][column];
                    strForBlank = strForBlank.replaceAll("\\-", "0");
                    dataArray[row][column] = strForBlank;
                }
                row++;
            }

            for (int selectRow = 1; selectRow < 39; selectRow++) {
                for (int selectColumn = 2; selectColumn < 4; selectColumn++) {
                    int value = Integer.parseInt(dataArray[selectRow][selectColumn]);
                    csvVal[selectRow][selectColumn] = value;
                }
            }
            
            Map<String, Integer> hashMap = new HashMap<>();
            double result;
            for (int numberOfCase = 1; numberOfCase < 39; numberOfCase++) {
                int crimeName = 1;
                int totalCrimes = 2;
                int firstOffender = 3;
                result = csvVal[numberOfCase][firstOffender] / csvVal[numberOfCase][totalCrimes] * 100;
                hashMap.put(dataArray[numberOfCase][crimeName], (int) result);
            }
            
            List<Map.Entry<String, Integer>> linkedList = new LinkedList<>(hashMap.entrySet());
            Collections.sort(linkedList, 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(linkedList);

            bReader.close();

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

 

 

코드 설명

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

try {
    File csv = new File("D:\\Crime2014.csv");
    BufferedReader bReader = new BufferedReader(new FileReader(csv));
    String line = "";
    int row = 0;
    int column = 0;

    while ((line = bReader.readLine()) != null) {
        String[] token = line.split(",");
        for (column = 0; column < 15; column++) {
            dataArray[row][column] = (token[column]);
            String strForBlank = dataArray[row][column];
            strForBlank = strForBlank.replaceAll("\\-", "0");
            dataArray[row][column] = strForBlank;
        }
        row++;
    }

 

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

 

2. 데이터 변환:

for (int selectRow = 1; selectRow < 39; selectRow++) {
    for (int selectColumn = 2; selectColumn < 4; selectColumn++) {
        int value = Integer.parseInt(dataArray[selectRow][selectColumn]);
        csvVal[selectRow][selectColumn] = value;
    }
}

 

 

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

 

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

Map<String, Integer> hashMap = new HashMap<>();
double result;
for (int numberOfCase = 1; numberOfCase < 39; numberOfCase++) {
    int crimeName = 1;
    int totalCrimes = 2;
    int firstOffender = 3;
    result = csvVal[numberOfCase][firstOffender] / csvVal[numberOfCase][totalCrimes] * 100;
    hashMap.put(dataArray[numberOfCase][crimeName], (int) result);
}

 

 

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

 

4. HashMap 정렬 및 출력:

List<Map.Entry<String, Integer>> linkedList = new LinkedList<>(hashMap.entrySet());
Collections.sort(linkedList, 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(linkedList);

 

 

  • 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