OpenCSV所有数据存储在单行版本(5.1)和数据丢失
OpenCSV all of the data storing in single line version (5.1) and data loss
您好,在使用 openCsv 保存对象时,数据存储在一行中,如果我尝试添加多个对象,则前一个对象的数据将被删除。如果有人知道解决方案,请在这里回答。
public final Logger log=Logger.getLogger("Error");
public void beanToCsvExport(final T object, final String filePath) {
if(object == null) {
log.warning("Initialization of object failed");
}else {
try {
Writer writer = new FileWriter(filePath);
StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).build();
beanToCsv.write(object);
writer.close();
} catch (IOException e) {
System.out.println(e.getMessage());
} catch (CsvDataTypeMismatchException e) {
System.out.println(e.getMessage());
} catch (CsvRequiredFieldEmptyException e) {
System.out.println(e.getMessage());
}
}
}
当您尝试写入多个 object 时,最后一个被覆盖,因为您传递给 StatefulBeanToCsv
的 FileWriter 未处于追加模式。您应该在 FileWriter 构造函数中指定追加模式。
Writer writer = new FileWriter(filePath, true);
StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).build();
beanToCsv.write(object);
writer.close();
编辑:这应该解决多列 header 和列 header 不断行的问题。它对我有用。
public <T> void beanToCsvExport(final List<T> object, final String filePath) {
if (object == null) {
System.out.println("Initialization of object failed");
} else {
try {
cleanFile(filePath);
FileWriter writer = new FileWriter(filePath, true);
StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).build();
beanToCsv.write(object);
writer.close();
} catch (IOException | CsvDataTypeMismatchException | CsvRequiredFieldEmptyException e) {
System.out.println(e.getMessage());
}
}
}
重置文件的函数:
public void cleanFile(String path) throws IOException {
FileWriter writer = new FileWriter(path); //Open as non-append to delete all data.
writer.write("");
writer.close();
}
测试功能:
public void employeesToCsv() {
List<Employee> list = Arrays.asList(new Employee("101", "sunny"), new Employee("102", "Andrew"));
beanToCsvExport(list, "file.csv");
}
实现的输出:
"eId","eName"
"101","sunny"
"102","Andrew"
您好,在使用 openCsv 保存对象时,数据存储在一行中,如果我尝试添加多个对象,则前一个对象的数据将被删除。如果有人知道解决方案,请在这里回答。
public final Logger log=Logger.getLogger("Error");
public void beanToCsvExport(final T object, final String filePath) {
if(object == null) {
log.warning("Initialization of object failed");
}else {
try {
Writer writer = new FileWriter(filePath);
StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).build();
beanToCsv.write(object);
writer.close();
} catch (IOException e) {
System.out.println(e.getMessage());
} catch (CsvDataTypeMismatchException e) {
System.out.println(e.getMessage());
} catch (CsvRequiredFieldEmptyException e) {
System.out.println(e.getMessage());
}
}
}
当您尝试写入多个 object 时,最后一个被覆盖,因为您传递给 StatefulBeanToCsv
的 FileWriter 未处于追加模式。您应该在 FileWriter 构造函数中指定追加模式。
Writer writer = new FileWriter(filePath, true);
StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).build();
beanToCsv.write(object);
writer.close();
编辑:这应该解决多列 header 和列 header 不断行的问题。它对我有用。
public <T> void beanToCsvExport(final List<T> object, final String filePath) {
if (object == null) {
System.out.println("Initialization of object failed");
} else {
try {
cleanFile(filePath);
FileWriter writer = new FileWriter(filePath, true);
StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).build();
beanToCsv.write(object);
writer.close();
} catch (IOException | CsvDataTypeMismatchException | CsvRequiredFieldEmptyException e) {
System.out.println(e.getMessage());
}
}
}
重置文件的函数:
public void cleanFile(String path) throws IOException {
FileWriter writer = new FileWriter(path); //Open as non-append to delete all data.
writer.write("");
writer.close();
}
测试功能:
public void employeesToCsv() {
List<Employee> list = Arrays.asList(new Employee("101", "sunny"), new Employee("102", "Andrew"));
beanToCsvExport(list, "file.csv");
}
实现的输出:
"eId","eName"
"101","sunny"
"102","Andrew"