今天是个好日子!我的目标是让csv阅读器在解析文件时跳过空白行,基本上什么也不做,只给我带有至少一个值的行.目前我有两个方法 - > 1st只是读取所有行作为字符串列表并返回它,第二个将结果转换为字符串列表列表,两者都是下面的:
private List<String[]> readCSVFile(File filename) throws IOException {
CSVReader reader = new CSVReader(new FileReader(filename));
List<String[]> allRows = reader.readAll();
return allRows;
}
public List<List<String>> readFile(File filename) throws IOException {
List<String[]> allRows = readCSVFile(filename);
List<List<String>> allRowsAsLists = new ArrayList<List<String>>();
for (String[] rowItemsArray : allRows) {
List<String> rowItems = new ArrayList<String>();
rowItems.addAll(Arrays.asList(rowItemsArray));
allRowsAsLists.add(rowItems);
}
return allRowsAsLists;
}
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是检查(在2'nd方法中)数组的长度,如果它的0只是为了忽略它 - 这将是这样的:
for (String[] rowItemsArray : allRows) {
**if(rowItemArray.length == 0) continue;**
List<String> rowItems = new ArrayList<String>();
rowItems.addAll(Arrays.asList(rowItemsArray));
allRowsAsLists.add(rowItems);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,由于即使行为空,它仍然返回一个元素数组 - 实际上是空字符串.检查单个字符串不是一个选项,因为有100多列,这是可变的.请建议实现这一目标的最佳方法是什么.谢谢.
用这种方式排序:
public List<List<String>> readFile(File filename) throws IOException {
List<String[]> allRows = readCSVFile(filename, includeHeaders, trimWhitespacesInFieldValues);
List<List<String>> allRowsAsLists = new ArrayList<List<String>>();
for (String[] rowItemsArray : allRows) {
**if(allValuesInRowAreEmpty(rowItemsArray)) continue;**
List<String> rowItems = new ArrayList<String>();
rowItems.addAll(Arrays.asList(rowItemsArray));
allRowsAsLists.add(rowItems);
}
return allRowsAsLists;
}
private boolean allValuesInRowAreEmpty(String[] row) {
boolean returnValue = true;
for (String s : row) {
if (s.length() != 0) {
returnValue = false;
}
}
return returnValue;
}
Run Code Online (Sandbox Code Playgroud)
For opencsv 5.0 there is an API-option to read CSV lines directly into a Bean.
对于喜欢使用“CsvToBean”功能的人,以下解决方案是在 CsvToBeanBuilder 上使用(遗憾的是已弃用的)#withFilter(..) 方法来跳过输入流中的空白行:
InputStream inputStream; // provided
List<MyBean> data = new CsvToBeanBuilder(new BufferedReader(new InputStreamReader(inputStream)))
.withType(MyBean.class)
.withFilter(new CsvToBeanFilter() {
/*
* This filter ignores empty lines from the input
*/
@Override
public boolean allowLine(String[] strings) {
for (String one : strings) {
if (one != null && one.length() > 0) {
return true;
}
}
return false;
}
}).build().parse();
Run Code Online (Sandbox Code Playgroud)
更新:在 opencsv 版本 5.1(日期为 2020 年 2 月 2 日)中,CsvToBeanFilter 根据功能请求#120已不再弃用。
你可以检查长度和第一个元素.如果该行仅包含字段分隔符,则长度> 1.如果该行包含单个space字符,则第一个元素不为空.
if (rowItemsArray.length == 1 && rowItemsArray[0].isEmpty()) {
continue;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7698 次 |
| 最近记录: |