我的目标是创建一个方法,它接收由一些char分隔的任何文件,并解析出用户需要的字段(列)并将其写入另一个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为我的建议。
答案 0 :(得分:1)
将if (!validLines.isEmpty())
更改为else if (!validLines.isEmpty())
。
答案 1 :(得分: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
你会有三个标题行。