Java FileWriter写入我的CSV的两个头

Java FileWriter写入我的CSV的两个头,java,file,csv,filewriter,Java,File,Csv,Filewriter,我的目标是创建一个方法,该方法提取任何由一些字符分隔的文件,解析出用户需要的字段(列),并将其写入另一个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 Vollqual

我的目标是创建一个方法,该方法提取任何由一些字符分隔的文件,解析出用户需要的字段(列),并将其写入另一个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();
  }
/**
*在CSV日期和
*镀金
* 
* 
*@param sourcePath Vollqualifizierter Quellpfad
*@param sourceseparator separator für die Quelldatei
*@param destinationPath Vollqualifizierter Zielpfad
*@param destinationSeperator分隔符für die Zieldatei
*@param fields Felder die CSV Datei geschrieben werden sollen
*@抛出FileNotFoundException
*@抛出异常
*/
私有void createCSVFile(字符串源路径、字符源分隔符、字符串目标路径、字符目标分隔符、集合字段)抛出FileNotFoundException、IOException
{
CSVReader reader=new CSVReader(新文件读取器(sourcePath),sourceseparator);
FileWriter writer=新的FileWriter(destinationPath);
字符串[]下一行;
Set validLines=new HashSet();
int i=0;
//待办事项:施赖特·莱德·诺赫2号马尔登头球?!
而((nextLine=reader.readNext())!=null)
{
如果(i==0)
{
int x=0;
用于(字符串行:下一行)
{
if(字段.包含(行))
{
有效线。添加(x);
//写标题
writer.append(行+目标计算器);
}
x++;
}
writer.append('\n');
}
如果(!validLines.isEmpty())
{
对于(整数v:有效线)
{
//写内容
writer.append(nextLine[v]+destinationSeperator);
}
writer.append('\n');
}
i++;
}
writer.flush();
writer.close();
reader.close();
}

也许你有一个更简单的方法

Node:im使用au.com.bytecode.opencsv.CSVReader进行我的提议。

如果(!validLines.isEmpty())
更改为
否则如果(!validLines.isEmpty())
reader.readNext()
不会返回一行,而是返回一个
字符串[]
,表示文件当前行中以CSV分隔的令牌。在
for..循环中使用此选项将导致在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

您将有三行标题。

与您的问题无关:您应该习惯用英语编写代码注释,并且只使用英语,而不是其他语言。对于程序员来说,最令人沮丧的事情莫过于使用谷歌翻译来理解代码注释。相信我,我是凭经验说话的。