2013-08-02 18 views
7

Ho alcuni file CSV con le stesse intestazioni di colonna. Per esempioUnisci file CSV in un singolo file senza intestazioni ripetute

file Un

header1,header2,header3 
one,two,three 
four,five,six 

File B

header1,header2,header3 
seven,eight,nine 
ten,eleven,twelve 

mi desidera unire in modo che i dati vengono uniti in un unico file con le intestazioni nella parte superiore, ma nessuna intestazione in qualsiasi altro luogo .

header1,header2,header3 
one,two,three 
four,five,six 
seven,eight,nine 
ten,eleven,twelve 

Qual è un buon modo per raggiungere questo obiettivo?

+0

Sto assumendo si sa come leggere file riga per riga. Quando si scrivono le righe su un file, saltare la prima riga in ogni file successivo dopo il primo. –

+0

O creare un file di testo che contenga solo l'intestazione e aggiungere ciascun CSV a quello mentre salta la prima riga, o leggerli tutti, senza saltare la prima riga del primo file. Il primo sarebbe un po 'più semplice, e il secondo sarebbe relativamente facile e più portabile se avessi set di file diversi con intestazioni diverse. – danielunderwood

risposta

2

Questo dovrebbe funzionare. Controlla se il file da unire ha intestazioni corrispondenti. Avrebbe gettato un'eccezione altrimenti. La gestione delle eccezioni (per chiudere i flussi, ecc.) È stata lasciata come esercizio.

String[] headers = null; 
String firstFile = "/path/to/firstFile.dat"; 
Scanner scanner = new Scanner(new File(firstFile)); 

if (scanner.hasNextLine()) 
    headers[] = scanner.nextLine().split(","); 

scanner.close(); 

Iterator<File> iterFiles = listOfFilesToBeMerged.iterator(); 
BufferedWriter writer = new BufferedWriter(new FileWriter(firstFile, true)); 

while (iterFiles.hasNext()) { 
    File nextFile = iterFiles.next(); 
    BufferedReader reader = new BufferedReader(new FileReader(nextFile)); 

    String line = null; 
    String[] firstLine = null; 
    if ((line = reader.readLine()) != null) 
    firstLine = line.split(","); 

    if (!Arrays.equals (headers, firstLine)) 
    throw new FileMergeException("Header mis-match between CSV files: '" + 
       firstFile + "' and '" + nextFile.getAbsolutePath()); 

    while ((line = reader.readLine()) != null) { 
    writer.write(line); 
    writer.newLine(); 
    } 

    reader.close(); 
} 
writer.close(); 
4

Ecco un esempio:

public static void main(String[] args) throws IOException { 
    List<Path> paths = Arrays.asList(Paths.get("c:/temp/file1.csv"), Paths.get("c:/temp/file2.csv")); 
    List<String> mergedLines = getMergedLines(paths); 
    Path target = Paths.get("c:/temp/merged.csv"); 
    Files.write(target, mergedLines, Charset.forName("UTF-8")); 
} 

private static List<String> getMergedLines(List<Path> paths) throws IOException { 
    List<String> mergedLines = new ArrayList<>(); 
    for (Path p : paths){ 
     List<String> lines = Files.readAllLines(p, Charset.forName("UTF-8")); 
     if (!lines.isEmpty()) { 
      if (mergedLines.isEmpty()) { 
       mergedLines.add(lines.get(0)); //add header only once 
      } 
      mergedLines.addAll(lines.subList(1, lines.size())); 
     } 
    } 
    return mergedLines; 
} 
+0

Che cos'è Paths, quale file jar è htis? – Siddharth

+0

fa parte del JDK standard da Java 7: http://docs.oracle.com/javase/7/docs/api/java/nio/file/Paths.html – assylias

+0

oh ok, grazie. dovrebbe aver controllato – Siddharth

3

Sembra un po 'pesante per fare questo in Java. È banale in una shell Linux:

(cat FileA ; tail --lines=+2 FileB) > FileC 
0

Prima:

idFile # x_y.csv

Dopo:

idFile.csv

Ad esempio:

100 # 1_2.csv + 100 # 2_2.csv> 100.csv

100 # 1_2.csv contiene:

"one","two","three" 
"a","b","c" 
"d","e","f" 

100 # 2_2.csv contiene:

"one","two","three" 
"g","h","i" 
"j","k","l" 

100.csv contiene:

"one","two","three" 
"a","b","c" 
"d","e","f"  
"g","h","i" 
"j","k","l" 

Fonte:

//MergeDemo.java 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.util.ArrayList; 
//import java.util.Arrays; 
import java.util.Iterator; 
import java.util.Scanner; 

public class MergeDemo { 

    public static void main(String[] args) { 

     String idFile = "100"; 
     int numFiles = 3; 

     try { 
      mergeCsvFiles(idFile, numFiles); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    private static void mergeCsvFiles(String idFile, int numFiles) throws IOException { 

     // Variables 
     ArrayList<File> files = new ArrayList<File>(); 
     Iterator<File> iterFiles; 
     File fileOutput; 
     BufferedWriter fileWriter; 
     BufferedReader fileReader; 
     String csvFile; 
     String csvFinal = "C:\\out\\" + idFile + ".csv"; 
     String[] headers = null; 
     String header = null; 

     // Files: Input 
     for (int i = 1; i <= numFiles; i++) { 
      csvFile = "C:\\in\\" + idFile + "#" + i + "_" + numFiles + ".csv"; 
      files.add(new File(csvFile)); 
     } 

     // Files: Output 
     fileOutput = new File(csvFinal); 
     if (fileOutput.exists()) { 
      fileOutput.delete(); 
     } 
     try { 
      fileOutput.createNewFile(); 
      // log 
      // System.out.println("Output: " + fileOutput); 
     } catch (IOException e) { 
      // log 
     } 

     iterFiles = files.iterator(); 
     fileWriter = new BufferedWriter(new FileWriter(csvFinal, true)); 

     // Headers 
     Scanner scanner = new Scanner(files.get(0)); 
     if (scanner.hasNextLine()) 
      header = scanner.nextLine(); 
     // if (scanner.hasNextLine()) headers = scanner.nextLine().split(";"); 
     scanner.close(); 

     /* 
     * System.out.println(header); for(String s: headers){ 
     * fileWriter.write(s); System.out.println(s); } 
     */ 

     fileWriter.write(header); 
     fileWriter.newLine(); 

     while (iterFiles.hasNext()) { 

      String line;// = null; 
      String[] firstLine;// = null; 

      File nextFile = iterFiles.next(); 
      fileReader = new BufferedReader(new FileReader(nextFile)); 

      if ((line = fileReader.readLine()) != null) 
       firstLine = line.split(";"); 

      while ((line = fileReader.readLine()) != null) { 
       fileWriter.write(line); 
       fileWriter.newLine(); 
      } 
      fileReader.close(); 
     } 

     fileWriter.close(); 

    } 

}