Allen's 데이터 맛집
[3] Java를 사용한 CSV 파일 데이터 분석 본문
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();
}
}
}
코드 설명
- 변수 초기화 및 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