2013-08-02 11 views
7

同じ列ヘッダーを持つCSVファイルがあります。例えばCSVファイルを1つのファイルにマージして、繰り返しのないヘッダーなし

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

は、私は、データが上部にヘッダを持つ一つのファイルにマージされるように、それをマージしたい

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

ファイルBファイルが、どこか他のヘッダーがありません。

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

これを達成するにはどうすればよいでしょうか?ここで

+0

。ファイルに行を書き戻すときは、最初の行の後に続く各行の最初の行をスキップします。 –

+0

ヘッダーだけを含むテキストファイルを作成し、最初の行をスキップしている間に各CSVを追加するか、最初のファイルの最初の行をスキップせずにすべてを読み込みます。最初のファイルは少し簡単ですし、別のファイルセットが異なるヘッダーを持っていれば、比較的簡単で移植性が向上します。 – danielunderwood

答えて

2

これはうまくいくはずです。マージされるファイルに一致するヘッダーがあるかどうかをチェックします。それ以外の場合は例外をスローします。例外処理(ストリームを閉じるなど)は練習として残されています。例えば

idFile.csv

:後

idFile#1 x_y.csv

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

は一例です:

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

パスとは何ですか、どのjarファイルがhtisですか? – Siddharth

+0

Java 7以来の標準JDKの一部です:http://docs.oracle.com/javase/7/docs/api/java/nio/file/Paths。html – assylias

+0

ああ、ありがとう、ありがとう。チェックしたはずです – Siddharth

3

Javaでこれを行うには少しヘビー級らしいです。 Linuxシェルではそれほどです:

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

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

100#1_2.csvは含まれています

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

100#2_2.csvは含まれています

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

100.csv含まれています

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

出典:私はあなたが行ごとにファイルを読み取る方法を知っているだろうと仮定してい

//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(); 

    } 

} 
関連する問題