라인 단위로 비교하여 맞추어 주는 유틸 : 빈 공백을 넣어 줌
이런걸누가쓸까ㅠㅠ 하지만 필요하게 되었다거....
입력과 출력을 보면 이해가 갈꺼라고 생각됩니다.
입력:
*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; } }
댓글 없음:
댓글 쓰기