2012-05-27 122 views
0

我在想什麼是循環瀏覽兩個csv文件並比較它們的列的最合適的方法。具體而言,我想比較csv file1第1列和csv file2第20列的每次迭代,並檢查是否有匹配。這是我到目前爲止。另外csv file1比csv file2小得多。如何比較兩個不同尺寸的Csv文件之間的值?

public class ClassifyData { 

public static void main(String[]args) throws IOException{ 

File file1 = new File("file1.csv"); 

File file2 = new File("file2.csv"); 
FileWriter writer = new FileWriter("/Users/home/Work.csv"); 
PrintWriter pw = new PrintWriter(writer); 
Scanner in = new Scanner(file1); 
Scanner in2 = new Scanner(file2); 
boolean firstLine = true; 
String[] temp = null; 
String [] temp2 = null; 
String line = null; 
String line2 = null; 

while((line = in.nextLine())!=null){ 

    temp= line.split(","); 
while(line2 = in2.nextLine() !=null){ 
    temp2 = line2.split(","); 


    if(temp[0] == temp[20]){ 
     System.out.println("match"); 
     pw.append("0"); 
     continue; 

    } 




    pw.append("\n"); 

    } 
} 

pw.flush(); 
pw.close(); 
writer.close(); 

} 

    } 
+0

好了,回到你早先發布的問題,看到的最好的答案是哪一個,而「接受「它 - 點擊它下面的刻度線。 – Ansari

回答

0

我不認爲你的解決方案將工作,因爲你只需要經歷兩次文件(你是通過兩個文件同時遞增)。鑑於第一個文件很小,我建議一次完整地瀏覽該文件,並將值存儲在散列表中的第一列中。然後遍歷第二個文件,並檢查第20列中的值是否出現在散列表中。

+0

謝謝Ansari,儘管我發現使用最適合我的努力的String的ArrayList。 –

+0

不客氣,儘管我仍然建議使用HashTable來獲得更好的性能。 – Ansari

1

在行if(temp[0] == temp[20])你可能意指if(temp[0].equals(temp2[20]))。這會給你你想要的比較。然而,你是內心的while循環仍然不會重新開始在第二個文件的開始,就像你似乎想要的。我不認爲Scanner對象可以重新開始一個文件,即使他們可以,你會通過反覆讀取同一文件浪費大量的文件讀取。這樣的事情將是你的磁盤更高效:

ArrayList<String> list1 = new ArrayList<String>; 
while((line = in.nextLine())!=null){ 
    temp= line.split(","); 
    list1.add(temp[0]); 
} 
// ... 
for(int i = 0; i < list1.size(); i++){ 
    for(int j = 0; j < list2.size(); j++){ 
     if(list1.get(i).equals(list2.get(j))){ 
      System.out.println("Match found"); 
     } 
    } 
} 

警告:未經測試的代碼