JAVA

[Java-개발해보기.3] WordCount, 단어를 세봅시다

식빵민 2022. 5. 25. 15:57

핵심 기능

  1.  txt파일 입력하면 해당 txt파일에 같은 단어가 몇개 인지 셈
  2.  한 단어당 같은 단어의 수를 출력하는 파일 출력
  3.  대문자, 소문자는 같은 단어로 셈

 

핵심 개발 내용

  1.  파일을 읽어 템플릿 파일에 저장하기
    1. 입력파일을 읽는 버퍼스트림 객체 생성
    2. 템플릿 파일 생성
    3. 입력파일을 한 줄 씩 읽어 소문자로 변환하여 한문단으로 변환하여 템플릿 파일로 출력
  2. 템플릿 파일을 읽어 같은 단어 세기
    1. 템플릿 파일은 한 문단
    2. 영어 알파벳과 숫자가 아닌 문자(특수문자, 빈칸)를 기준으로 문자열을 split해 문자열 배열로 단어들 저장
    3. 단어의 수 만큼 해당 단어와 같은 값이 몇갠지 저장하는 배열 만들기
    4. 한 단어를 기준으로 모든 단어들과 비교하며 같은 값을 가지면 num_of_same[]배열에 +1
    5. 한 단어를 기준으로 바로 다음 단어부터 중복된 단어는 num_of_same0로 만들기 ( 한 단어에 대한 중복되는 단어의 수가 여러 번 출력되는 것을 막기 위함)
    6. 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");
		}
	}

}