1 package driver; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 import java.util.Hashtable; 6 7 import fileIO.TextFile; 8 9 public class MergeTextFiles { 10 main(String[] args)11 public static void main(String[] args){ 12 CharSequence sb=mergeWithHeader(args[0], args[1], 0, 1); 13 System.out.println(sb); 14 } 15 mergeWithHeader(String fname1, String fname2, int col1, int col2)16 public static StringBuilder mergeWithHeader(String fname1, String fname2, int col1, int col2){ 17 18 TextFile tf1=new TextFile(fname1, false); 19 String[][] lines1=TextFile.doublesplitTab(tf1.toStringLines(), false); 20 tf1.close(); 21 tf1=null; 22 23 TextFile tf2=new TextFile(fname2, false); 24 String[][] lines2=TextFile.doublesplitTab(tf2.toStringLines(), false); 25 tf2.close(); 26 tf2=null; 27 28 int maxWidth1=findMaxWidth(lines1); 29 int maxWidth2=findMaxWidth(lines2); 30 31 Hashtable<String, String[]> table1=makeTable(lines1, col1, 1); 32 Hashtable<String, String[]> table2=makeTable(lines2, col2, 1); 33 34 HashSet<String> keySet=new HashSet<String>(); 35 keySet.addAll(table1.keySet()); 36 keySet.addAll(table2.keySet()); 37 String[] keys=keySet.toArray(new String[0]); 38 Arrays.sort(keys); 39 40 StringBuilder sb=new StringBuilder(); 41 sb.append(toString(lines1[0], lines2[0], maxWidth1, maxWidth2)); 42 sb.append('\n'); 43 44 for(String key : keys){ 45 String[] line1=table1.get(key); 46 String[] line2=table2.get(key); 47 48 if(line1==null){ 49 line1=new String[col1+1]; 50 line1[col1]=line2[col2]; 51 } 52 53 sb.append(toString(line1, line2, maxWidth1, maxWidth2)); 54 sb.append('\n'); 55 } 56 57 return sb; 58 } 59 toString(String[] a, String[] b, int alen, int blen)60 private static StringBuilder toString(String[] a, String[] b, int alen, int blen){ 61 StringBuilder sb=new StringBuilder(); 62 for(int i=0; i<alen; i++){ 63 if(a!=null && a.length>i && a[i]!=null){ 64 sb.append(a[i]); 65 } 66 sb.append('\t'); 67 } 68 for(int i=0; i<blen; i++){ 69 if(b!=null && b.length>i && b[i]!=null){ 70 sb.append(b[i]); 71 } 72 sb.append('\t'); 73 } 74 return sb; 75 } 76 makeTable(String[][] lines, int col, int firstLine)77 private static Hashtable<String, String[]> makeTable(String[][] lines, int col, int firstLine) { 78 Hashtable<String, String[]> table=new Hashtable<String, String[]>(); 79 for(int i=firstLine; i<lines.length; i++){ 80 String[] line=lines[i]; 81 table.put(line[col], line); 82 } 83 return table; 84 } 85 findMaxWidth(String[][] matrix)86 private static int findMaxWidth(String[][] matrix){ 87 int max=0; 88 for(String[] line : matrix){ 89 if(line!=null && max<line.length){max=line.length;} 90 } 91 return max; 92 } 93 94 } 95