使用 CsvBeanReader 时有没有办法跳过 header?
Is there a way to skip the header when using CsvBeanReader?
我有一个项目,我应该在其中将 object 写入 CSV 文件。我目前正在为此使用 ICsvBeanWriter,但每次传递新记录时,它也会写入 header。从文件读取时会产生问题。
下面分别是读取和写入的方法:
public static ArrayList<communication> readCSV() throws IOException {
ArrayList<communication> fileText = new ArrayList<>();
ICsvBeanReader beanReader = new CsvBeanReader(new FileReader("products.csv"), CsvPreference.STANDARD_PREFERENCE);
String[] header = beanReader.getHeader(true);
CellProcessor[] processors = new CellProcessor[]{
new ParseDouble(), // Distance
new ParseDouble(), // Efficiency
new ParseDouble(),// fuel
new ParseDouble(),// total
};
communication com;
while ((com = beanReader.read(communication.class, header, processors)) != null) {
fileText.addAll(Collections.singletonList(com));
}
return fileText;
}
public static void writeCSV(double tripDistance, double fuelEfficiency, double costOfFuel, double totalCost) throws Exception {
// create a list of employee
List<communication> EmployeeList = new ArrayList<>();
EmployeeList.add(new communication(tripDistance, fuelEfficiency, costOfFuel, (Math.round(totalCost * 100.0) / 100.0)));
ICsvBeanWriter beanWriter = new CsvBeanWriter(new FileWriter("products.csv",true),
CsvPreference.STANDARD_PREFERENCE);
String[] header = new String[]{"TripDistance", "FuelEfficiency", "FuelCost", "Total"};
beanWriter.writeHeader(header);
CellProcessor[] processors = new CellProcessor[]{
new ParseDouble(), // Distance
new ParseDouble(), // Efficiency
new ParseDouble(),// fuel
new ParseDouble(),// total
};
for (communication com : EmployeeList) {
beanWriter.write(com, header, processors);
}
beanWriter.close();
}
我想要一种跳过写入或读取 header 或创建删除所有 header 行(跳过第一行)的方法。
这是出现的错误:
org.supercsv.exception.SuperCsvCellProcessorException: 'TripDistance' could not be parsed as a Double
processor=org.supercsv.cellprocessor.ParseDouble
这些代码行创建一个 header:
String[] header = new String[]{"TripDistance", "FuelEfficiency", "FuelCost", "Total"};
beanWriter.writeHeader(header);
我想你可以从你的代码中删除它们。
首先,您使用 opencsv 对其进行了标记,但您似乎实际上是在根据代码中的 class 名称使用 supercsv。这个答案是基于那个观察。
阅读时跳过header的两种方法。
选项 1:reader class 有一个 getHeader() 方法,根据文档可以完成此工作。
选项 2:传递给 CsvBeanReader 的第一个参数是 reader,它应该传递数据。
因此,如果您想跳过 header,您可以将 reader 传递给它,它已经完成了。 BufferedReader 有一种读取一行的便捷方法,因此您可以丢弃第一行。这是假设 CSV 格式正确且顶部没有空行。
BufferedReader br = new BufferedReader(new FileReader("products.csv"));
br.readLine(); // discard header
ICsvBeanReader beanReader = new CsvBeanReader(br, CsvPreference.STANDARD_PREFERENCE);
我有一个项目,我应该在其中将 object 写入 CSV 文件。我目前正在为此使用 ICsvBeanWriter,但每次传递新记录时,它也会写入 header。从文件读取时会产生问题。
下面分别是读取和写入的方法:
public static ArrayList<communication> readCSV() throws IOException {
ArrayList<communication> fileText = new ArrayList<>();
ICsvBeanReader beanReader = new CsvBeanReader(new FileReader("products.csv"), CsvPreference.STANDARD_PREFERENCE);
String[] header = beanReader.getHeader(true);
CellProcessor[] processors = new CellProcessor[]{
new ParseDouble(), // Distance
new ParseDouble(), // Efficiency
new ParseDouble(),// fuel
new ParseDouble(),// total
};
communication com;
while ((com = beanReader.read(communication.class, header, processors)) != null) {
fileText.addAll(Collections.singletonList(com));
}
return fileText;
}
public static void writeCSV(double tripDistance, double fuelEfficiency, double costOfFuel, double totalCost) throws Exception {
// create a list of employee
List<communication> EmployeeList = new ArrayList<>();
EmployeeList.add(new communication(tripDistance, fuelEfficiency, costOfFuel, (Math.round(totalCost * 100.0) / 100.0)));
ICsvBeanWriter beanWriter = new CsvBeanWriter(new FileWriter("products.csv",true),
CsvPreference.STANDARD_PREFERENCE);
String[] header = new String[]{"TripDistance", "FuelEfficiency", "FuelCost", "Total"};
beanWriter.writeHeader(header);
CellProcessor[] processors = new CellProcessor[]{
new ParseDouble(), // Distance
new ParseDouble(), // Efficiency
new ParseDouble(),// fuel
new ParseDouble(),// total
};
for (communication com : EmployeeList) {
beanWriter.write(com, header, processors);
}
beanWriter.close();
}
我想要一种跳过写入或读取 header 或创建删除所有 header 行(跳过第一行)的方法。
这是出现的错误:
org.supercsv.exception.SuperCsvCellProcessorException: 'TripDistance' could not be parsed as a Double
processor=org.supercsv.cellprocessor.ParseDouble
这些代码行创建一个 header:
String[] header = new String[]{"TripDistance", "FuelEfficiency", "FuelCost", "Total"};
beanWriter.writeHeader(header);
我想你可以从你的代码中删除它们。
首先,您使用 opencsv 对其进行了标记,但您似乎实际上是在根据代码中的 class 名称使用 supercsv。这个答案是基于那个观察。
阅读时跳过header的两种方法。
选项 1:reader class 有一个 getHeader() 方法,根据文档可以完成此工作。
选项 2:传递给 CsvBeanReader 的第一个参数是 reader,它应该传递数据。
因此,如果您想跳过 header,您可以将 reader 传递给它,它已经完成了。 BufferedReader 有一种读取一行的便捷方法,因此您可以丢弃第一行。这是假设 CSV 格式正确且顶部没有空行。
BufferedReader br = new BufferedReader(new FileReader("products.csv"));
br.readLine(); // discard header
ICsvBeanReader beanReader = new CsvBeanReader(br, CsvPreference.STANDARD_PREFERENCE);