Skip to main content

폴더의 파일 열어 작업하기

요건 : 

특정 폴더의 파일을 모두 열러서 SQL에 있는 특정 문구로 시작하는 테이블명을 찾는다 

쿼리당 하나 이상일 때는 하나로 카운트한다. 

즉 쿼리하나에 하나의 API를 생성하여 타 도메인에서 현재 도메인의 테이블을 조회하는 것을 배제하여 DBMS를 분리할 수 있도록 한다. 

 Main 프로그램 

package com.det;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SocParsingWorker {
	
	public static String[] annotation_line = {"--", "//"};
	public static String[][] annotation_range = {
											{	"/*", "*/", "/\\*", "\\*/"		}
											,{	"<!--", "-->", "<!--", "-->"	}
										};
	public static String[][] searchKeyCategoryArry = {
								{ "<select", "</select>" }
								, { "<delete", "</delete>" }
								, { "<update", "</update>" }
								, { "<delete", "</delete>" }
	};
	// 찾는 문자 
	public static String findkeyString = "TB_FILEMANAGER_META";

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		System.out.println(" START ");
		String fileName = "";
		List<String> docRemoveAnn = new ArrayList<String>();
		StringRemovAnno stringRemovAnno = new StringRemovAnno();
		SearchString ss = new SearchString();
		Map<String, Integer> resultMapg = new HashMap<String, Integer>();  // SocParsingWorker.searchKeyArry.length
		Map<String, Integer> totalResultMapg = new HashMap<String, Integer>();

		/* 파일 경로에 있는 파일 가져오기 */
		File rw = new File(args[0]);

		/* 파일 경로에 있는 파일 리스트 fileList[] 에 넣기 */
		File[] fileList = rw.listFiles();

		/* fileList에 있는거 for 문 돌려서 출력 */
		for (File file : fileList) {
			if (file.isFile()) {
				fileName = file.getName();
				System.out.println(":::::::::::: PROC FILE NAME : " + fileName + "::::::::::::");
				
				// Remove Annotation 
				// annotation_range
				// annotation_line
				docRemoveAnn = stringRemovAnno.getStringRemovAnno(fileName, file.getPath());
				
				// 주석 제거된 문서 docRemoveAnn를 활용 
				// searchKeyCategoryArry
				resultMapg = ss.getSearchCnt(docRemoveAnn);
				System.out.println(":::::::::::: File="+ fileName +" , Result=" + resultMapg + "::::::::::::\n");
				
				// Total add count by searchKeyCategoryArry
				for (int i = 0; i < SocParsingWorker.searchKeyCategoryArry.length; i++) {
					totalResultMapg.put(SocParsingWorker.searchKeyCategoryArry[i][0].toUpperCase(), 
							toNlltoZero(totalResultMapg.get(SocParsingWorker.searchKeyCategoryArry[i][0].toUpperCase()))
							+toNlltoZero(resultMapg.get(SocParsingWorker.searchKeyCategoryArry[i][0].toUpperCase()))
							);
				}
				
			}
		}
		System.out.println("\n\n\n>>>>>>>>>> All File Find [\""+ findkeyString +"\"] Result=" + totalResultMapg);
	}

	private static int toNlltoZero(Integer integer) {
		if(integer==null) {
			return 0;
		}
		return integer;
	}


}

주석 제거 클래스 

package com.det;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class StringRemovAnno {

	public List<String> getStringRemovAnno(String filename, String filepath) throws IOException {
		System.out.println(" > fileName Path : " + filepath);
		List<String> fileLineArry = Files.readAllLines(Paths.get(filepath));
		List<String> removedAnnoRangeByte = fileLineArry;

		// 파일을 읽어서 범위의 주석을 삭제
		for (int i = 0; i < SocParsingWorker.annotation_range.length; i++) {
			removedAnnoRangeByte = removedAnnoRangeByte(filename, removedAnnoRangeByte, SocParsingWorker.annotation_range[i]);
		}
		// 라인을 읽어서 라인 주석을 삭제 
		for (int i = 0; i < SocParsingWorker.annotation_line.length; i++) {
			removedAnnoRangeByte = removedAnnoLineByte(filename, removedAnnoRangeByte, SocParsingWorker.annotation_line[i]);
		}

		return removedAnnoRangeByte;
	}
	

	/**
	 * 영역 주석 제거 
	 * @param filename
	 * @param fileByte
	 * @return
	 */
	private List<String> removedAnnoRangeByte(String filename, List<String> fileLineArry, String[] annRange) {
		System.out.println("  > Remove Anno Range : " + filename + " [" + annRange[0] + " , " + annRange[1] + "]");
		List<String> removedAnnoRangeByte = new ArrayList<String>();
		
//		System.out.println("   > ORG One Line : " + fileLineArry);
		
		//for ann
		boolean annFlag = false;
	
		for (String oneLine : fileLineArry) {
			int startAnnRag = oneLine.indexOf(annRange[0]);
			int endAnnRag = oneLine.indexOf(annRange[1]);
			
//			System.out.println("   > RED One Line : " + oneLine + " ---------->" + startAnnRag);
			
			// 한줄에 모두 있을 때 
			if(startAnnRag >= 0 && endAnnRag >= 0){
				if(!annFlag) {
					// 사이를 넣어라 
					String ffoneLine = oneLine.substring(0,startAnnRag);
					removedAnnoRangeByte.add(ffoneLine);
					oneLine = oneLine.substring(endAnnRag+annRange[1].length(),oneLine.length());
					removedAnnoRangeByte.add(oneLine);
				}

			// 시작이 있을 때 
			}else if(startAnnRag >= 0) {
				if(oneLine.trim().equals(annRange[0])) {
					// skip ... 이상하네 정규 표현식에서 /* 만 있을 때 /*가 표시됨  
				}else {
					oneLine = oneLine.replaceAll(""+annRange[2]+".*([^*]|[\\r\\n])", "");
					removedAnnoRangeByte.add(oneLine);
//					System.out.println("   > line : " + oneLine + " [" + annRange[0] + " , " + annRange[1] + "] =========> START:" + startAnnRag );
				}
				annFlag = true;
			
			// 끝이 있을 때 
			}else if(endAnnRag >= 0) {
				oneLine = oneLine.replaceAll(".*"+annRange[3]+"*([^*]|[\\r\\n])", "");
				removedAnnoRangeByte.add(oneLine);
//				System.out.println("   > line : " + oneLine + " [" + annRange[0] + " , " + annRange[1] + "] =========> START:" + startAnnRag );
				annFlag = false;
			}
			
			// 둘다 없고 시작이 안되었을 때 
			if(startAnnRag < 0 && endAnnRag < 0){
				if(!annFlag) {
					removedAnnoRangeByte.add(oneLine);
				}
			}
		}
//		System.out.println("   > FLT One Line : " + removedAnnoRangeByte);
		
		//for ann
		return removedAnnoRangeByte;
	}

	/**
	 * LIne 주석 제거 
	 * @param filename
	 * @param removedAnnoRangeByte
	 * @param string
	 * @return
	 */
	private List<String> removedAnnoLineByte(String filename, List<String> fileLineArry, String ann) {
		System.out.println("  > Remove Anno Line : " + filename + " [" + ann + "]");
		List<String> removedAnnoLineByte = new ArrayList<String>();
		for (String oneLine : fileLineArry) {
			int startAnnLine = oneLine.indexOf(ann);
			//System.out.println("..........>>>>>" + oneLine + " , " + startAnnLine);
			if( startAnnLine >= 0 ) {
				oneLine = oneLine.substring(0,startAnnLine);
				removedAnnoLineByte.add(oneLine);
				//System.out.println("   > RED One Line : " + oneLine);
			}else {
				removedAnnoLineByte.add(oneLine);
			}
		}
		return removedAnnoLineByte;
	}

}

 

문구 찾기 

package com.det;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SearchString {

	public Map<String, Integer> getSearchCnt(List<String> docRemoveAnn) {
		StringBuffer fileToOneLine = new StringBuffer();
		Map<String, Integer> resultMapg = new HashMap<String, Integer>();
		
		for (String onLineNoAnno : docRemoveAnn) {			
			fileToOneLine.append(onLineNoAnno);
		}
//		System.out.println(fileToOneLine);
		
		// searchKeyArry 로 구분하여 배열로 정의 
		for (int i = 0; i < SocParsingWorker.searchKeyCategoryArry.length; i++) {
//			System.out.println("  >> SEARCH STAR ! key=\"" + SocParsingWorker.searchKeyArry[i][0] +"\" ... \"" + SocParsingWorker.searchKeyArry[i][1] + "\"");
			int searchCnt = 0;
			String[] searchArry = fileToOneLine.toString().toUpperCase().split(SocParsingWorker.searchKeyCategoryArry[i][0].toUpperCase());
			for (int j = 0; j < searchArry.length; j++) {
				String s = searchArry[j];
//	        	System.out.println("   > search : " + s);
	            if(s.indexOf(SocParsingWorker.searchKeyCategoryArry[i][1].toUpperCase()) >= 0) {
	            	System.out.println("  >> Find! (" + j + ")" + SocParsingWorker.searchKeyCategoryArry[i][0].toUpperCase() + "-" + SocParsingWorker.searchKeyCategoryArry[i][1].toUpperCase()
	            			+" " + s.indexOf(SocParsingWorker.searchKeyCategoryArry[i][1].toUpperCase()) + " Col");
	            	s = s.substring(0, s.indexOf(SocParsingWorker.searchKeyCategoryArry[i][1].toUpperCase()));
	            	System.out.println("       \\_ TEXT = \"" + s + "\"");
	            	if(s.indexOf(SocParsingWorker.findkeyString) >= 0) {
//		            	System.out.println("   >> target String : " + s);
	            		searchCnt++;
	            	}
	            }
	        }
			System.out.println("   >> ::::::::: key=\"" + SocParsingWorker.searchKeyCategoryArry[i][0] +"-" + SocParsingWorker.searchKeyCategoryArry[i][1] + "\" , FIND(\""+SocParsingWorker.findkeyString+"\") Total Cnt = " + searchCnt);  
			resultMapg.put(SocParsingWorker.searchKeyCategoryArry[i][0].toUpperCase(), searchCnt);
		}
			
		return resultMapg;
	}

}