JAVA
[Java-개발해보기.3] WordCount, 단어를 세봅시다
식빵민
2022. 5. 25. 15:57
핵심 기능
- txt파일 입력하면 해당 txt파일에 같은 단어가 몇개 인지 셈
- 한 단어당 같은 단어의 수를 출력하는 파일 출력
- 대문자, 소문자는 같은 단어로 셈
핵심 개발 내용
- 파일을 읽어 템플릿 파일에 저장하기
- 입력파일을 읽는 버퍼스트림 객체 생성
- 템플릿 파일 생성
- 입력파일을 한 줄 씩 읽어 소문자로 변환하여 한문단으로 변환하여 템플릿 파일로 출력
- 템플릿 파일을 읽어 같은 단어 세기
- 템플릿 파일은 한 문단
- 영어 알파벳과 숫자가 아닌 문자(특수문자, 빈칸)를 기준으로 문자열을 split해 문자열 배열로 단어들 저장
- 단어의 수 만큼 해당 단어와 같은 값이 몇갠지 저장하는 배열 만들기
- 한 단어를 기준으로 모든 단어들과 비교하며 같은 값을 가지면 num_of_same[]배열에 +1
- 한 단어를 기준으로 바로 다음 단어부터 중복된 단어는 num_of_same을 0로 만들기 ( 한 단어에 대한 중복되는 단어의 수가 여러 번 출력되는 것을 막기 위함)
- num_of_same[i]의 값이 0이 아니고 words[i]가 빈칸이 아니면 fw를 이용해 목적파일에 출력
import java.util.*;
import java.io.*;
public class WordsCount {
public static void main(String[] args) {
System.out.println("김수환/컴퓨터공학과/12211580");
Scanner scnr = new Scanner(System.in);
BufferedReader br = null;// 입력할 텍스트 파일을 읽을 버퍼리더
FileOutputStream fos = null;// 입력할 파일을 소문자로 변환해 템플릿 파일에 출력할 스트림
BufferedReader br2 = null;// 입력한 파일을 소문자로 변환한 템플릿 파일을 읽을 버퍼리더
FileWriter fw = null; // 결과값을 출력할 파일라이터
System.out.print("Input File Name : ");
String src = scnr.next();// 입력할 파일명 입력
System.out.print("Output File Name : ");
String dest = scnr.next();// 출력할 파일명 입력
try {
br = new BufferedReader(new FileReader(src));// 입력 파일 파일리더로 읽어 버퍼리더 객체 생성
fos = new FileOutputStream("temp.txt");// 템플릿 파일 생성
String l ;
while((l = br.readLine())!=null){//입력 파일 한줄씩 읽어 줄바꿈 제거
fos.write(l.toLowerCase().getBytes());// 템플릿 파일에 파일을 버퍼리더로 읽어 소문자로 변환
}
br.close();// 버퍼 스트림 닫기
fos.close();// 바이트 스트림 닫기
br2 = new BufferedReader(new FileReader("temp.txt"));// 템플릿 파일 파일리더로 읽어 버퍼리더 객체 생성
fw = new FileWriter(dest);// 출력할 목적 파일 dest변수의 값을 이름으로 생성
String rdr = null;// 템플릿 파일 한 줄씩 복사할 문자열 변수
while((rdr = br2.readLine())!=null){// 파일에 rdr이 복사할 다음 줄이 없을때까지 rdr 버퍼에 복사
System.out.println(rdr);
String[] words = rdr.split("[^a-zA-Z0-9_]");//특수문자로 split해서 문자열 배열로 저장
int num = words.length;// split된 단어의 갯수
int []num_of_same = new int[num];// 단어의 갯수만큼 같은 단어의 수 저장하는 배열 생성
for(int i=0; i<num; i++){// 한 단어당
for(int j=0; j<num; j++) {// 모든 단어에 한번씩 겹치는거 세기
if(words[i].equals(words[j])) {// 같은 단어 있으면
num_of_same[i]+=1;//같은 단어의 수 + 1
}
}
}
for(int i=0; i<num; i++) {// 한 단어당
for(int j=i+1; j<num; j++) {// 다음 단어 부터 끝까지
if(words[i].equals(words[j])) {// 중복된 단어는
num_of_same[j]=0; // 같은 단어의 수 0으로 만들기
}
}
if(num_of_same[i]!=0&&words[i]!="") {// 중복된 단어가 아니고 빈칸이 아니면
fw.write(words[i] + ":\t" + num_of_same[i]+"\n");
}
}
}
br2.close();// 버퍼 스트림 닫기
scnr.close();// 스캐너 닫기
fw.close();// 문자 스트림 닫기
}
catch(IOException e) {// 입출력 예외 처리
System.out.println("There's a problem");
}
}
}