Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用opencsv(java)读取.csv文件时跳过空行_Java_Arrays_Csv - Fatal编程技术网

使用opencsv(java)读取.csv文件时跳过空行

使用opencsv(java)读取.csv文件时跳过空行,java,arrays,csv,Java,Arrays,Csv,大家好! 我的目标是让CSV阅读器在解析文件时跳过空白行,基本上什么也不做,只给我带至少一个值的行。 目前我有两个方法->第一个方法只是将所有行作为字符串列表数组读取并返回,第二个方法将结果转换为字符串列表,如下所示: private List<String[]> readCSVFile(File filename) throws IOException { CSVReader reader = new CSVReader(new FileReader(filename))

大家好! 我的目标是让CSV阅读器在解析文件时跳过空白行,基本上什么也不做,只给我带至少一个值的行。 目前我有两个方法->第一个方法只是将所有行作为字符串列表数组读取并返回,第二个方法将结果转换为字符串列表,如下所示:

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;

}
private List readCSVFile(文件名)引发IOException{
CSVReader reader=new CSVReader(new FileReader(filename));
List allRows=reader.readAll();
返回所有行;
}
公共列表读取文件(文件名)引发IOException{
List allRows=readCSVFile(文件名);
List allrowsalists=new ArrayList();
对于(字符串[]行项目数组:所有行){
List rowItems=新建ArrayList();
addAll(Arrays.asList(rowItemsArray));
添加(行项目);
}
返回所有行列表;
}
我的第一个想法是(在第2个方法中)检查数组的长度,如果它为0,则忽略它-这类似于:

for (String[] rowItemsArray :  allRows) {
            **if(rowItemArray.length == 0) continue;**
            List<String> rowItems = new ArrayList<String>();
            rowItems.addAll(Arrays.asList(rowItemsArray));
            allRowsAsLists.add(rowItems);

}  
(字符串[]行项目数组:所有行)的
{
**如果(rowItemArray.length==0)继续**
List rowItems=新建ArrayList();
addAll(Arrays.asList(rowItemsArray));
添加(行项目);
}  
不幸的是,这不起作用,因为即使行为空,它仍然返回一个元素数组——实际上是空字符串。检查单个字符串不是一个选项,因为有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;
    }
public List readFile(文件名)引发IOException{
列出allRows=readCSVFile(文件名,包括标题、TrimWhiteSpacesinFieldValue);
List allrowsalists=new ArrayList();
对于(字符串[]行项目数组:所有行){
**如果(所有值为空(行项为空))继续**
List rowItems=新建ArrayList();
addAll(Arrays.asList(rowItemsArray));
添加(行项目);
}
返回所有行列表;
}
私有布尔值AllValuesRowAreEmpty(字符串[]行){
布尔返回值=真;
用于(字符串s:行){
如果(s.长度()!=0){
returnValue=false;
}
}
返回值;
}

您可以检查长度和第一个元素。如果该行仅包含字段分隔符,则长度>1。如果行包含单个
空格
字符,则第一个元素不是空的

if (rowItemsArray.length == 1 && rowItemsArray[0].isEmpty()) {
    continue;
}

您可以在修剪完每行的所有字符串值后对它们进行汇总。如果结果字符串为空,则任何单元格中都没有值。在这种情况下,忽略该行。
类似这样的内容:

private boolean onlyEmptyCells(ArrayList<String> check) {
    StringBuilder sb = new StringBuilder();
    for (String s : check) {
        sb.append(s.trim());
    }
    return sb.toString().isEmpty(); //<- ignore 'check' if this returns true
}
private boolean onlymptycells(数组列表检查){
StringBuilder sb=新的StringBuilder();
for(字符串s:检查){
某人附加(s.trim());
}

返回sb.toString().isEmpty();//对于opencsv 5.0,有一个API选项可以将CSV行直接读取到Bean中

对于喜欢使用“CsvToBean”功能的人,以下解决方案是使用CsvToBeanBuilder上的(不幸被弃用的)#with filter(..)方法跳过输入流中的空行:

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();
InputStream InputStream;//已提供
列表数据=新的CsvToBeanBuilder(新的BufferedReader(新的InputStreamReader(inputStream)))
.withType(MyBean.class)
.带过滤器(新的CsvToBeanFilter(){
/*
*此筛选器忽略输入中的空行
*/
@凌驾
公共布尔allowLine(字符串[]字符串){
for(字符串一:字符串){
if(one!=null&&one.length()>0){
返回true;
}
}
返回false;
}
}).build().parse();

更新:使用opencsv 5.1版(日期为2020年2月2日),CsvToBeanFilter未根据功能请求进行预处理。

您应该完全避免读取空行。这意味着,返回的字符串数组列表不应包含空条目。因此,请更新您的
readCSVFile
方法。使用
opencsv
5.1版该怎么办@Martin@logbasexCsvToBeanFilter仅被标记正如在5.0中被弃用一样,并且该弃用标记在5.1中再次被删除。您可以将上述代码与opencsv 5.0和opencsv 5.1一起使用