如何使用 OpenCSV 在同一个 CSV 文件上写入一列,即使文件为空?
How to write a column on the same CSV file with OpenCSV, even when the file is empty?
我必须编写一个代码,该代码必须能够将列(值的数组 String[])和该列的 header 写入 CSV 文件。在这两种情况下,它都必须将该列写入输出 .csv 文件,当它不存在时以及当已经有一个名为输入值文件的文件时。当然,我想在同一个文件上读写。
这是代码:
public void afegir_columna_csv(String file, String header, String[] contingut) {
try {
FileWriter filewriter = new FileWriter(file, true);
CSVWriter csvWriter = new CSVWriter(filewriter);
FileReader filereader = new FileReader(file);
CSVReader csvReader = new CSVReader(filereader);
String head = header;
String[] values = contingut;
String[] entries = null;
//Adding the header part:
String[] H = csvReader.readNext();
ArrayList listH = new ArrayList(Arrays.asList(H));
listH.add(head);
csvWriter.writeNext((String[]) listH.toArray());
Añadimos los valores:
int i=0;
while((entries = csvReader.readNext()) != null) {
ArrayList list = new ArrayList(Arrays.asList(entries));
list.add(values[i]);
csvWriter.writeNext((String[]) list.toArray());
}
csvWriter.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
我一直在测试代码,这就是两种情况下发生的情况:
1.If 文件存在但为空:它不写入第一列。
2.If 该文件已经存在并且上面有列:它抛出一个强制转换异常(我在其中强制转换 (String[]) list.toArray()).
关于如何正确完成它的任何想法?
谢谢!
这是我在测试编号 2 上遇到的错误:
java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.String; ([Ljava.lang.Object; and [Ljava.lang.String; are in module java.base of loader 'bootstrap')
经过一段时间的分析,我找到了一个可行的解决方案。我不太确定它是否超级高效,但它确实起作用了。不得不改变我从文件 header 和内容中获取信息的方式,将其更改为仅内容。
这是代码:
public void add_column_csv(String[] contingut) {
try {
String filename = "output_preproces.csv";
File _file = new File(filename);
if(_file.createNewFile()) { //If the file doesn't exists, create and add the first column
FileWriter filewriter = new FileWriter(filename, true);
CSVWriter csvWriter = new CSVWriter(filewriter);
List<String[]> data = new ArrayList<String[]>();
int i=0;
while(i < contingut.length) {
data.add(new String[] {contingut[i]});
i++;
}
csvWriter.writeAll(data);
csvWriter.close();
}
else { //If the file already exists, add a column to it:
FileReader filereader = new FileReader(filename);
CSVReader csvReader = new CSVReader(filereader);
List<String[]> data = new ArrayList<String[]>();
int i=0;
while(i < contingut.length) {
String[] nextLine;
nextLine = csvReader.readNext();
String[] aux = new String[nextLine.length + 1];
aux[nextLine.length] = contingut[i];
int j = 0;
while(j < nextLine.length) {aux[j] = nextLine[j]; j++;};
data.add(aux);
i++;
}
csvReader.close();
new FileWriter(filename, false).close(); //delete the old content of the file
FileWriter filewriter = new FileWriter(filename, true);
CSVWriter csvWriter = new CSVWriter(filewriter);
csvWriter.writeAll(data);
csvWriter.close();
}
} catch(Exception e) {
e.printStackTrace();
}
}
如您所见,我不得不将 CSVReader 与 CSVWriter 分开,并将所有数据保存在列表中。
我必须编写一个代码,该代码必须能够将列(值的数组 String[])和该列的 header 写入 CSV 文件。在这两种情况下,它都必须将该列写入输出 .csv 文件,当它不存在时以及当已经有一个名为输入值文件的文件时。当然,我想在同一个文件上读写。 这是代码:
public void afegir_columna_csv(String file, String header, String[] contingut) {
try {
FileWriter filewriter = new FileWriter(file, true);
CSVWriter csvWriter = new CSVWriter(filewriter);
FileReader filereader = new FileReader(file);
CSVReader csvReader = new CSVReader(filereader);
String head = header;
String[] values = contingut;
String[] entries = null;
//Adding the header part:
String[] H = csvReader.readNext();
ArrayList listH = new ArrayList(Arrays.asList(H));
listH.add(head);
csvWriter.writeNext((String[]) listH.toArray());
Añadimos los valores:
int i=0;
while((entries = csvReader.readNext()) != null) {
ArrayList list = new ArrayList(Arrays.asList(entries));
list.add(values[i]);
csvWriter.writeNext((String[]) list.toArray());
}
csvWriter.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
我一直在测试代码,这就是两种情况下发生的情况: 1.If 文件存在但为空:它不写入第一列。 2.If 该文件已经存在并且上面有列:它抛出一个强制转换异常(我在其中强制转换 (String[]) list.toArray()).
关于如何正确完成它的任何想法? 谢谢!
这是我在测试编号 2 上遇到的错误:
java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.String; ([Ljava.lang.Object; and [Ljava.lang.String; are in module java.base of loader 'bootstrap')
经过一段时间的分析,我找到了一个可行的解决方案。我不太确定它是否超级高效,但它确实起作用了。不得不改变我从文件 header 和内容中获取信息的方式,将其更改为仅内容。 这是代码:
public void add_column_csv(String[] contingut) {
try {
String filename = "output_preproces.csv";
File _file = new File(filename);
if(_file.createNewFile()) { //If the file doesn't exists, create and add the first column
FileWriter filewriter = new FileWriter(filename, true);
CSVWriter csvWriter = new CSVWriter(filewriter);
List<String[]> data = new ArrayList<String[]>();
int i=0;
while(i < contingut.length) {
data.add(new String[] {contingut[i]});
i++;
}
csvWriter.writeAll(data);
csvWriter.close();
}
else { //If the file already exists, add a column to it:
FileReader filereader = new FileReader(filename);
CSVReader csvReader = new CSVReader(filereader);
List<String[]> data = new ArrayList<String[]>();
int i=0;
while(i < contingut.length) {
String[] nextLine;
nextLine = csvReader.readNext();
String[] aux = new String[nextLine.length + 1];
aux[nextLine.length] = contingut[i];
int j = 0;
while(j < nextLine.length) {aux[j] = nextLine[j]; j++;};
data.add(aux);
i++;
}
csvReader.close();
new FileWriter(filename, false).close(); //delete the old content of the file
FileWriter filewriter = new FileWriter(filename, true);
CSVWriter csvWriter = new CSVWriter(filewriter);
csvWriter.writeAll(data);
csvWriter.close();
}
} catch(Exception e) {
e.printStackTrace();
}
}
如您所见,我不得不将 CSVReader 与 CSVWriter 分开,并将所有数据保存在列表中。