2016-09-19 31 views
-2
public class CompareCSV { 
    public static void main(String args[]) throws FileNotFoundException, IOException { 
     String path = "C:\\csv\\"; 
     String file1 = "file1.csv"; 
     String file2 = "file2.csv"; 
     String file3 = "file3.csv"; 
     ArrayList<String> al1 = new ArrayList<String>(); 
     ArrayList<String> al2 = new ArrayList<String>(); 

     BufferedReader CSVFile1 = new BufferedReader(new FileReader("/C:/Users/bida0916/Desktop/macro.csv")); 
     String dataRow1 = CSVFile1.readLine(); 
     while (dataRow1 != null) { 
      String[] dataArray1 = dataRow1.split(","); 
      for (String item1 : dataArray1) { 
       al1.add(item1); 
      } 
      dataRow1 = CSVFile1.readLine(); 
     } 
     CSVFile1.close(); 

     BufferedReader CSVFile2 = new BufferedReader(new FileReader("C:/Users/bida0916/Desktop/Deprecated.csv")); 
     String dataRow2 = CSVFile2.readLine(); 
     while (dataRow2 != null) { 
      String[] dataArray2 = dataRow2.split(","); 
      for (String item2 : dataArray2) { 
       al2.add(item2); 
      } 
      dataRow2 = CSVFile2.readLine(); 
     } 
     CSVFile2.close(); 

     for (String bs : al2) { 
      al1.remove(bs); 
     } 

     int size = al1.size(); 
     System.out.println(size); 

     try { 
      FileWriter writer = new FileWriter("C:/Users/bida0916/Desktop/NewMacro.csv"); 
      while (size != 0) { 
       size--; 
       writer.append("" + al1.get(size)); 
       writer.append('\n'); 
      } 
      writer.flush(); 
      writer.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

我想比較java中的兩個csv文件,並希望通過比較兩個文件的第一列從另一個csv文件中刪除一個csv文件的完整細節。目前我正在收到一個csv文件,只有一列只有所有細節混亂。如何根據一列來比較和編輯java中的兩個csv文件?

回答

0

您要添加的所有列的所有值到一個列表,這就是爲什麼你在你的輸出的爛攤子:

ArrayList<String> al1=new ArrayList<String>(); 
//... 
String[] dataArray1 = dataRow1.split(","); 
for (String item1:dataArray1) 
{ 
    al1.add(item1); 
} 

從文件添加完整的字符串數組到列表中,那麼你就可以訪問您以結構化方式的數據:

List<String[]> al1 = new ArrayList<>(); 
//... 
String[] dataArray1 = dataRow1.split(","); 
al1.add(dataArray1); 

但對於去除行的,我建議使用Map S代表更快的訪問,其中的關鍵是,你決定刪除該行的元素和值是從您的cvs文件全行:

Map<String, String> al1 = new HashMap<>(); // or LinkedHashMap if row order is relevant 
//... 
String[] dataArray1 = dataRow1.split(","); 
al1.put(dataArray1[0], dataRow1); 

但請注意,如果文件中的兩行在第一列中包含相同的值,則只會保留一個值。如果可能的話,您可能需要採用該解決方案將數據存儲在Map<String, Set<String>>Map<String, List<String>>中。

在這一點上,我想推薦給解壓文件讀取到一個單獨的方法,它可以重用同時讀你的輸入文件,並減少重複代碼:

Map<String, String> al1 = readInputCsvFile(file1); 
Map<String, String> al2 = readInputCsvFile(file2); 

對於這應被刪除的行刪除,遍歷映射之一的按鍵並從其他條目:

for (String key : al2.keySet()) { 
    al1.remove(key); 
} 

以及編寫輸出文件,只寫從原始文件讀取的行存儲在地圖的「值」中。

for (String dataRow : al1.values()) { 
    writer.append(dataRow); 
    writer.append('\n'); 
} 

編輯

如果你需要根據你倒是應該存儲在地圖上,而不是從文件中讀取全行字符串「分裂陣」等數據列執行操作。然後,您可以單獨獲得所有數據列:

Map<String, String[]> al2 = new HashMap<>(); 
//... 
String[] dataArray2 = dataRow2.split(","); 
al2.put(dataArray2[0], dataArray2); 

您可能會添加刪除條件:

for (Entry<String, String[]> entry : al2.entrySet()) { 
    String[] data = entry.getValue(); 
    if ("delete".equals(data[17])) { 
     al1.remove(entry.getKey()); 
    } 
} 

要編寫輸出文件,您必須重新生成csv格式。 我建議使用Apache commons-langStringUtils該任務:

for (String[] data : al1.values()) { 
    writer.append(StringUtils.join(data, ",")); 
    writer.append('\n'); 
} 
+0

馬庫斯感謝輸入,但你可以請告訴我如何刪除基於元素上的完整的行,因爲現在一列被刪除,得到我和想要刪除完整的行 – Biswajit

+0

@Biswajit我不確定是否正確理解了您的問題,但我更新了有關訪問CSV文件中其他數據列的答案。 //用'map.remove(key)'刪除整行。 //如果我的回答有幫助,請勾選勾號接受它。 –

+0

感謝@markus你一直很有幫助,但我一直在嘗試太多的方式,但仍然無法達到預期的效果。你能告訴我如何刪除例如包含在名爲B的CSV文件中的50行包含2500行的C文件。實際上,我有一個包含50行的CSV文件,應始終與來自客戶端的新CSV文件進行比較,如果這些行在客戶端csv中存在,則應將其刪除。 – Biswajit