2017-03-18 31 views
0

我在一個目錄中擁有多於100個csv文件,它們具有相同的列名,我想將它們合併爲一個單個頭文件的csv文件我怎麼能在java中做到這一點。 我已經寫了一個程序,它將從一個目錄中的多個zip文件夾中提取所有csv文件,現在我想將這些多個csv文件合併到一個具有單頭的csv文件中。 另外我想刪除它們中的重複項,如果有任何基於某些列的比較。如何將多個csv文件合併到單個標題的單個csv文件中,同時刪除基於特定列的重複項

例如:

CSV1:

編號名稱編號 1拉吉1234 2拉梅什2345 3 Jayesh 3467

CSV2:

編號名稱編號 1內甚4756 2 Suresh 7575 3 Jayesh 9999

這種類似我有一個CSV文件100,我想它與單頭 像這種合併爲一個CSV:

ID名稱數量
1拉吉1234 2拉梅什4321 3 Jayesh 4567 1 Ganesh神4756 2蘇雷什7575

正如我們可以看到,因爲他在這兩個CSV文件中的條目jayesh將只出現一次。 (在這個例子中,我使用名稱進行比較) 這只是一個只有3列的例子,但在我的真正csv中,我有20多列。

我該如何在Java程序中做到這一點?

回答

1

我不明白你爲什麼你的數據在同一行:「ID名稱編號1 Raj 1234 2 Ramesh 2345 3 Jayesh 3467」,而不是在每行的記錄。然後,你說它是CSV。 CSV是逗號分隔值。所以我希望你的列以「,」分隔。所以我會認爲你的數據其實是這樣的:

Id,Name,Number 
1,Raj,1234 
2,Ramesh,2345 
3,Jayesh,3467 

我會考慮你沒有在你的問題上做出介紹的努力。

此外,我不明白你想要做什麼與具有相同id的行的值。你說你不想重複,但你沒有解釋如何處理重複值(保留第一個值,連接,如果是整數,則添加...)。讓我們考慮一下我們想要保持與第一行相關的值。

所以,你可以這樣做:

public static void main(String[] args) throws IOException { 
    File inputFolder = new File("yourFolderPath"); 
    Set<String> alreadyMetNames = new HashSet<>(); 
    File output = File.createTempFile("output", ".csv"); 
    try (FileWriter fw = new FileWriter(output); BufferedWriter bw = new BufferedWriter(fw)) { 
     bw.write("Id,Name,Number"); 
     bw.newLine(); 
     for (File file : inputFolder.listFiles()) { 
      try (FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr)) { 
       String line; 

       // Search the header line 
       while ((line = br.readLine()) != null) { 
        if (line.startsWith("Id")) break; 
       } 

       // Start to parse the file at the first row containing data 
       while ((line = br.readLine()) != null) { 
        String[] split = line.split(","); 
        if (alreadyMetNames.add(split[1])) {// If the name has not already been met 
         bw.write(line); 
         bw.newLine(); 
        } 
       } 
      } 
     } 
    } 
    System.out.println("Your file is here : " + output.getAbsolutePath()); 
} 

這段代碼創建一個新文件concatening其他文件內容的作家。然後它對每個文件進行迭代,搜索標題行,最後將標題行下面的數據內容寫入最終的輸出文件。在編寫行時,它會考慮不重寫已滿足的id行。

相關問題