2014년 11월 11일 화요일

Java 라인 비교하여 빈공백 넣기(?) 뭔말인지

2개의 파일이 있고 라인 단위의 어떤 비교해야 할 대상이 있다면 두개의 비슷한 소스 가 있을때 또 는 kernel config 파일 이라던지 등등 비슷한 내용의 diff파일을 생성할 수 있도록 도움을 줍니다.

라인 단위로 비교하여 맞추어 주는 유틸 : 빈 공백을 넣어 줌
이런걸누가쓸까ㅠㅠ 하지만 필요하게 되었다거....
입력과 출력을 보면 이해가 갈꺼라고 생각됩니다.

입력:
*A파일
BBB
CCC
EEE
*B파일
AAA
BBB
CCC
DDD
FFF

결과:
A.new파일
1: 
2:BBB
3:CCC
4: 
5:EEE
6: 
B.new파일
1:AAA
2:BBB
3:CCC
4:DDD
5: 
6:FFF


import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collections;

/*
 * 기능 파일을 입력받아 sorting 후에 파일을 비교해서
 * 같은 항목은 줄을 맞추어 주는 역할을 한다.
 * 
 * 라인 단위로 비교하여 맞추어 주는 유틸 : 이런걸 누가쓸까 ㅠㅠ
 */
public class lineSortNCompare {
 /*
  1. 2개의 파일을 입력받는다.
  2. 각각 파일으로 오름차순으로 sort한다.
  3. 두개의 파일을 비교하되, 같은 위치가 아닌부분은 공백라인을 넣는다.
    ex) 각각 파일이 2개 나옴
      A 파일        B 파일
      ----      ----
      AAA       
      BBB       BBB
                CCC
  4. 입출력 설명         
     test("BBB\nCCC\nEEE\n","AAA\nBBB\nCCC\nDDD\nFFF\n");
     입력:
     *A파일
     BBB
     CCC
     EEE
     
     *B파일
     AAA
     BBB
     CCC
     DDD
     FFF     
     결과:
  *************
  1: 
  2:BBB
  3:CCC
  4: 
  5:EEE
  6: 
  *************
  1:AAA
  2:BBB
  3:CCC
  4:DDD
  5: 
  6:FFF
  * 
  */
 /**
  * @param args
  */
 
 static ArrayList<String> list1copy = new ArrayList<String>();
 static ArrayList<String> list2copy = new ArrayList<String>();
 final static boolean IS_TEST = false;
 public static void main(String[] args) {
  if( IS_TEST ){
   test("BBB\nCCC\nEEE\n","AAA\nBBB\nCCC\nDDD\nFFF\n");
  }else{
   System.out.println(args[0]+" "+args[1]);
   saveLineSortNCompare(args[0], args[1]);
  }
 }
 
 private static void test(String file1, String file2) {
  ArrayList<String> list1 = null;
  ArrayList<String> list2 = null;

  try {
   list1 = convertStreamToStringArray(new ByteArrayInputStream(file1.getBytes("UTF-8")));
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  }
  try {
   list2 = convertStreamToStringArray(new ByteArrayInputStream(file2.getBytes("UTF-8")));
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  }

  Collections.sort(list1);
  Collections.sort(list2);
  compareNAddNewLine(list1,list2);
  System.out.println("*************");
  filePrint(list1copy);
  System.out.println("*************");
  filePrint(list2copy);
 }

 private static void saveLineSortNCompare(String name1, String name2) {
  String file1 = readFile(name1);
  String file2 = readFile(name2);
  ArrayList<String> list1 = null;
  ArrayList<String> list2 = null;

  try {
   list1 = convertStreamToStringArray(new ByteArrayInputStream(file1.getBytes("UTF-8")));
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  }
  try {
   list2 = convertStreamToStringArray(new ByteArrayInputStream(file2.getBytes("UTF-8")));
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  }

  Collections.sort(list1);
  Collections.sort(list2);
  compareNAddNewLine(list1,list2);
  
  fileWrite(name1+".new",list1copy);
  fileWrite(name2+".new",list2copy);
  fileWriteMix(name1+".mix",list1copy,list2copy);
 }

 private static void fileWriteMix(String name,
   ArrayList<String> list1, ArrayList<String> list2) {
  FileWriter writer = null;
  int i = 0;
  try {
   writer = new FileWriter(name);
   for(String str: list1) {
    writer.write(str+","+list2.get(i++)+"\n");
   }
   writer.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
 }

 private static void fileWrite(String name, ArrayList<String> list) {
  FileWriter writer = null;
  try {
   writer = new FileWriter(name);
   for(String str: list) {
    writer.write(str+"\n");
   }
   writer.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 
 private static void filePrint(ArrayList<String> list) {
  int i=0;
  for(String str: list) {
   i++;
   System.out.println(""+i+":"+str);
  }
 }
 
 // 주요함수 2개의 string list를 입력받아 줄을 맞추어 주는 함수이다. 
 private static void compareNAddNewLine(ArrayList<String> list1, ArrayList<String> list2) {
  int size1 = list1.size();
  int size2 = list2.size();
  int i = 0,j = 0;
  int c;
  String str1,str2;
  for(i=0,j=0;;){
   c = 0;
   if( i >= size1 ) {
    str1 = null;
    c = +1;
   }else{
    str1 = list1.get(i).trim();
   }
   if( j >= size2 ) {
    str2 = null;
    c = -1;
   }else{
    str2 = list2.get(j).trim();
   }
   if( str2!=null && str1!=null)
    c = str1.compareTo( str2 );
   if( str2==null && str1==null ) break;

   if( c == 0 ) {
    j++;i++;
    list1copy.add(str1);
    list2copy.add(str2);
    continue;
   }
   if( c > 0 ){
    j++;
    list1copy.add(" ");
    list2copy.add(str2);
    continue;
   }
   if( c < 0 ){
    i++;
    list1copy.add(str1);
    list2copy.add(" ");
    continue;
   }
  }
 }

 // 파일 읽는 함수
 public static String readFile(String name){
  int readcount=0;
  String ret = "";
  try {
   File file = new File(name);
   if( file!=null && file.exists() ) {
    FileInputStream fis = new FileInputStream(file);
    readcount = (int)file.length();
    byte[] buffer = new byte[readcount];
    fis.read(buffer);
    fis.close();
    ret = new String(buffer,0,buffer.length,"UTF-8");
   }else{
    return null;
   }
  } catch (Exception e) {
   e.printStackTrace();
   return null;
  }
  return ret;
 }

 // Stream 을 ArrayList로 변환
 private static ArrayList<String> convertStreamToStringArray(InputStream is) {
  BufferedReader reader = new BufferedReader(new InputStreamReader(is));
  ArrayList<String> sal = new ArrayList<String>();

  String line = null;
  try {
   while ((line = reader.readLine()) != null) {
    sal.add(line);
   }
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    is.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  return sal;
 }
}

댓글 없음:

댓글 쓰기