2013-06-13 59 views
0

我的目標是創建一個方法,該文件接收由某些字符分隔的任何文件,並解析用戶需要的字段(列)並將其寫入另一個CSV文件。 Jdoc是德國人,對不起!下面是代碼:Java FileWriter寫入我的CSV的兩個頭文件

/** 
* Erstellt von einer beliebigen Datei über einen Seperator eine CSV Datei und 
* filtert die Felder raus die es zu suchen gilt 
* 
* 
* @param sourcePath Vollqualifizierter Quellpfad 
* @param sourceSeperator Seperator für die Quelldatei 
* @param destinationPath Vollqualifizierter Zielpfad 
* @param destinationSeperator Seperator für die Zieldatei 
* @param fields Felder die in die CSV Datei geschrieben werden sollen 
* @throws FileNotFoundException 
* @throws IOException 
*/ 
    private void createCSVFile(String sourcePath, char sourceSeperator, String destinationPath, char destinationSeperator, Set<String> fields) throws FileNotFoundException, IOException 
    { 
    CSVReader reader = new CSVReader(new FileReader(sourcePath), sourceSeperator); 
    FileWriter writer = new FileWriter(destinationPath); 
    String[] nextLine; 
    Set<Integer> validLines = new HashSet<Integer>(); 
    int i = 0; 
    // TODO STWE: Schreibt leider noch 2 mal den Header ?! 
    while ((nextLine = reader.readNext()) != null) 
    { 
     if (i == 0) 
     { 
     int x = 0; 
     for (String row : nextLine) 
     { 
      if (fields.contains(row)) 
      { 
      validLines.add(x); 
      //Write the Header 
      writer.append(row + destinationSeperator); 
      } 
      x++; 
     } 
     writer.append('\n'); 
     } 
     if (!validLines.isEmpty()) 
     { 
     for (Integer v : validLines) 
     { 
      //Write the Content 
      writer.append(nextLine[v] + destinationSeperator); 
     } 
     writer.append('\n'); 
     } 
     i++; 
    } 
    writer.flush(); 
    writer.close(); 
    reader.close(); 
    } 


也許你有一個更簡單的方法來做到這一點。

節點:即時通訊使用au.com.bytecode.opencsv.CSVReader爲我的建議。

+0

與您的問題無關:您應該習慣於使用英文編寫代碼註釋,只能使用英文,而不是其他語言。對於程序員來說,很少有事情比使用谷歌翻譯來理解代碼評論更令人沮喪。相信我,我從經驗中發言。 –

回答

1

更改if (!validLines.isEmpty())else if (!validLines.isEmpty())

0

reader.readNext()沒有返回一行,而是一個String[],它表示文件當前行中的CSV分隔標記。在for..each循環中使用它將導致您的標題在CSV的第一行中爲每個標記打印一次。

for (String row : nextLine) //looping for each token in the first line 
    { 
     if (fields.contains(row)) 
     { 
     validLines.add(x); 
     //Write the Header 
     writer.append(row + destinationSeperator); 
     } 
     x++; 
    } 

如果CSV看起來像:

a,b,c 
a,b 

您將有三個標題行。