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