当前位置: 首页 > 面试题库 >

如何使用supercsv跳过仅空白行和具有可变列的行

端木元青
2023-03-14
问题内容

我正在处理CSV解析器要求,并且正在使用supercsv解析器库。我的CSV文件可以有25列(由tab(|)分隔)和最多100k行,并带有附加的标题行。

我想忽略仅空白行和少于25列的行。

我正在使用具有名称映射(将csv值设置为pojo)和字段处理器(用于处理验证)的IcvBeanReader来读取文件。

我假设Supercsv IcvBeanReader默认情况下会跳过空格行。但是,如果一行包含少于25个列号,该如何处理?


问题答案:

您可以通过编写自己的Tokenizer轻松地做到这一点。

例如,以下Tokenizer的行为与默认行为相同,但将跳过没有正确列数的任何行。

public class SkipBadColumnCountTokenizer extends Tokenizer {

    private final int expectedColumns;

    private final List<Integer> ignoredLines = new ArrayList<>();

    public SkipBadColumnCountTokenizer(Reader reader, 
            CsvPreference preferences, int expectedColumns) {
        super(reader, preferences);
        this.expectedColumns = expectedColumns;
    }

    @Override
    public boolean readColumns(List<String> columns) throws IOException {
        boolean moreInputExists;
        while ((moreInputExists = super.readColumns(columns)) && 
            columns.size() != this.expectedColumns){
            System.out.println(String.format("Ignoring line %s with %d columns: %s", getLineNumber(), columns.size(), getUntokenizedRow()));
            ignoredLines.add(getLineNumber());
        }

        return moreInputExists;

    }

    public List<Integer> getIgnoredLines(){
        return this.ignoredLines;
    }
}

以及使用此Tokenizer进行的简单测试…

@Test
public void testInvalidRows() throws IOException {

    String input = "column1,column2,column3\n" +
            "has,three,columns\n" +
            "only,two\n" +
            "one\n" +
            "three,columns,again\n" +
            "one,too,many,columns";

    CsvPreference preference = CsvPreference.EXCEL_PREFERENCE;
    int expectedColumns = 3;
    SkipBadColumnCountTokenizer tokenizer = new SkipBadColumnCountTokenizer(
        new StringReader(input), preference, expectedColumns);

    try (ICsvBeanReader beanReader = new CsvBeanReader(tokenizer, preference)) {
        String[] header = beanReader.getHeader(true);
        TestBean bean;
        while ((bean = beanReader.read(TestBean.class, header)) != null){
            System.out.println(bean);
        }
        System.out.println(String.format("Ignored lines: %s", tokenizer.getIgnoredLines()));
    }

}

打印以下输出(注意如何跳过所有无效行):

TestBean{column1='has', column2='three', column3='columns'}
Ignoring line 3 with 2 columns: only,two
Ignoring line 4 with 1 columns: one
TestBean{column1='three', column2='columns', column3='again'}
Ignoring line 6 with 4 columns: one,too,many,columns
Ignored lines: [3, 4, 6]


 类似资料:
  • 问题内容: 这是我的代码,我能够打印每行,但是当出现空白行时,它会打印;由于CSV文件格式,因此当空白行出现时我想跳过 问题答案: 如果要跳过所有空格行,则应使用以下测试:。 由于您可能需要做的事情不只是将非空白行打印到控制台上(不需要使用CSV模块),因此这里是一个涉及DictReader的示例:

  • 我有一个如下: 我希望playbook可以完全跳过(不要尝试执行中的任何任务)。但是看起来中的所有任务都将被调用,但不会被执行。 文件: 文件 : 输出是: 你可以说中的任务也被调用但跳过了。但是我希望在中不会调用任何任务。 可能吗?

  • 我有CSV文件,其中有一些空白行。JMeter CSV数据配置中是否有设置,以排除空白行并仅读取具有值的行。 请在这方面提供帮助。

  • 问题内容: 我正在编写此代码: 此代码忽略空行,但我也想忽略以#开头的行(注释)。 任何想法如何添加多个模式? 问题答案: 更改为 要么 如果您想在之前忽略空格。

  • 问题内容: 我正在向数据库中插入许多行,而某些行中的某些列是空白的。 如何在不为这些空白字段分配虚拟值的情况下插入? 我的问题出在第2行,其中城市名称和另一个值之间有一个空白值。理想情况下,我希望该值保持为空。 任何帮助表示赞赏。 谢谢! 问题答案: 只需告诉它插入一个空值即可:

  • 问题内容: 我期望使用扫描仪进行输入,直到没有任何输入为止(即,当用户输入空白行时)。我该如何实现? 我试过了: 但这会让我陷入困境 问题答案: 这是一种方法: