仅使用 OpenCSV 部分解析 CSV 文件
Only partialially parse a CSV file with OpenCSV
我有一个 CSV 文件,我想在 Java 中使用 OpenCSV 的 csvreader.
进行解析
为此,我创建了一个将信息映射到的 bean object。我的有点长,所以这是我从教程中获得的示例:
package net.viralpatel.java;
public class Country {
private String countryName;
private String capital;
public String getCountryName() {
return countryName;
}
public void setCountryName(String countryName) {
this.countryName = countryName;
}
public String getCapital() {
return capital;
}
public void setCapital(String capital) {
this.capital = capital;
}
}
我用来解析 CSV 文件并将信息映射到 bean 的代码类似于以下代码:
ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
strat.setType(Country.class);
String[] columns = new String[] {"countryName", "capital"};
strat.setColumnMapping(columns);
CsvToBean csv = new CsvToBean();
String csvFilename = "C:\sample.csv";
CSVReader csvReader = new CSVReader(new FileReader(csvFilename));
List list = csv.parse(strat, csvReader);
问题是我的 CSV 不仅包含原始数据,还包含列标题和其他数据。对于列标题,我通过仅使用 :
从特定行读取我的文件来解决问题
CSVReader csvReader = new CSVReader(new FileReader(csvFilename), ';', '\'', 1);
(1 是阅读开始的行)
其他数据主要是文件末尾(例如)整数列中的字符串。
例如,我有一个包含整数信息的 "Max Speed" 列,紧挨着一个包含整数信息的 "Distance" 列。但是在 "Distance" 列的末尾有总距离,因此字符串 "total:" 位于它旁边的 "Max Speed" 列中。
我该怎么做才能确保 reader 忽略这最后几行,只读取上面的原始信息?
PS : 我读的CSV文件有不同的长度。所以说 "stop reading after line X" 不会成功。另一方面,"appendix" 行总是相同的。所以说 "Stop reading two lines before the end of the file" 应该有效。
非常感谢您的帮助。
在将原始字符串数组映射到 bean 之前,您总是可以降低级别并检查原始字符串数组:
ColumnPositionMappingStrategy<Country> strat = new ColumnPositionMappingStrategy<Country>();
strat.setType(Country.class);
String[] columns = new String[] {"countryName", "capital"};
strat.setColumnMapping(columns);
PublicProcessLineCsvToBean<Country> csv = new PublicProcessLineCsvToBean<Country>();
String csvFilename = "C:\sample.csv";
CSVReader csvReader = new CSVReader(new FileReader(csvFilename));
List<Country> list = new ArrayList<Country>();
String [] row = csvReader.readNext(); //skip header
if(row == null) throw new RuntimeException("File is empty");
row = csvReader.readNext();
String [] nextRow = csvReader.readNext();
while(row != null) {
if(nextRow == null) break; //check what 'row' is last
if("Total:".equalsIgnoreCase(row[1])) break; //check column for special strings
list.add(csv.processLine(strat, row));
row = nextRow;
nextRow = csvReader.readNext();
}
并制作 processLine public:
public static class PublicProcessLineCsvToBean<T> extends CsvToBean<T> {
@Override
public T processLine(MappingStrategy<T> mapper, String[] line) throws IllegalAccessException, InvocationTargetException, InstantiationException, IntrospectionException {
return super.processLine(mapper, line);
}
}
如果您使用的是较新版本的 opencsv,则将 CsvToBeanFilter 注入 CSVtoBean class。 opencsv javadoc 给出了一个如何创建过滤器的极好示例。对于您的示例,您只需创建一个过滤器,如果最大速度为 null、空或 "total:"
,其 allowLine 方法将为 return false
我有一个 CSV 文件,我想在 Java 中使用 OpenCSV 的 csvreader.
进行解析为此,我创建了一个将信息映射到的 bean object。我的有点长,所以这是我从教程中获得的示例:
package net.viralpatel.java;
public class Country {
private String countryName;
private String capital;
public String getCountryName() {
return countryName;
}
public void setCountryName(String countryName) {
this.countryName = countryName;
}
public String getCapital() {
return capital;
}
public void setCapital(String capital) {
this.capital = capital;
}
}
我用来解析 CSV 文件并将信息映射到 bean 的代码类似于以下代码:
ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
strat.setType(Country.class);
String[] columns = new String[] {"countryName", "capital"};
strat.setColumnMapping(columns);
CsvToBean csv = new CsvToBean();
String csvFilename = "C:\sample.csv";
CSVReader csvReader = new CSVReader(new FileReader(csvFilename));
List list = csv.parse(strat, csvReader);
问题是我的 CSV 不仅包含原始数据,还包含列标题和其他数据。对于列标题,我通过仅使用 :
从特定行读取我的文件来解决问题CSVReader csvReader = new CSVReader(new FileReader(csvFilename), ';', '\'', 1);
(1 是阅读开始的行)
其他数据主要是文件末尾(例如)整数列中的字符串。
例如,我有一个包含整数信息的 "Max Speed" 列,紧挨着一个包含整数信息的 "Distance" 列。但是在 "Distance" 列的末尾有总距离,因此字符串 "total:" 位于它旁边的 "Max Speed" 列中。
我该怎么做才能确保 reader 忽略这最后几行,只读取上面的原始信息?
PS : 我读的CSV文件有不同的长度。所以说 "stop reading after line X" 不会成功。另一方面,"appendix" 行总是相同的。所以说 "Stop reading two lines before the end of the file" 应该有效。
非常感谢您的帮助。
在将原始字符串数组映射到 bean 之前,您总是可以降低级别并检查原始字符串数组:
ColumnPositionMappingStrategy<Country> strat = new ColumnPositionMappingStrategy<Country>();
strat.setType(Country.class);
String[] columns = new String[] {"countryName", "capital"};
strat.setColumnMapping(columns);
PublicProcessLineCsvToBean<Country> csv = new PublicProcessLineCsvToBean<Country>();
String csvFilename = "C:\sample.csv";
CSVReader csvReader = new CSVReader(new FileReader(csvFilename));
List<Country> list = new ArrayList<Country>();
String [] row = csvReader.readNext(); //skip header
if(row == null) throw new RuntimeException("File is empty");
row = csvReader.readNext();
String [] nextRow = csvReader.readNext();
while(row != null) {
if(nextRow == null) break; //check what 'row' is last
if("Total:".equalsIgnoreCase(row[1])) break; //check column for special strings
list.add(csv.processLine(strat, row));
row = nextRow;
nextRow = csvReader.readNext();
}
并制作 processLine public:
public static class PublicProcessLineCsvToBean<T> extends CsvToBean<T> {
@Override
public T processLine(MappingStrategy<T> mapper, String[] line) throws IllegalAccessException, InvocationTargetException, InstantiationException, IntrospectionException {
return super.processLine(mapper, line);
}
}
如果您使用的是较新版本的 opencsv,则将 CsvToBeanFilter 注入 CSVtoBean class。 opencsv javadoc 给出了一个如何创建过滤器的极好示例。对于您的示例,您只需创建一个过滤器,如果最大速度为 null、空或 "total:"
,其 allowLine 方法将为 return false