0

私の目的は、文字で区切られたファイルを取得し、ユーザーが必要とするフィールド (列) を解析して別の CSV ファイルに書き込むメソッドを作成することでした。Jdoc はドイツ語です。申し訳ありません。コードは次のとおりです。

/**
 * 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 を使用しています。

4

2 に答える 2

1

に変更if (!validLines.isEmpty())else if (!validLines.isEmpty())ます。

于 2013-06-13T08:35:33.267 に答える
0

reader.readNext()単一の行を返すのではなくString[]、ファイルの現在の行にある CSV で区切られたトークンを表す です。これをfor..eachループで使用すると、ヘッダーが CSV の最初の行のトークンごとに 1 回出力されます。

  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

3 つのヘッダー行があります。

于 2013-06-13T08:38:22.337 に答える