【问题标题】:Using Univocity CSV parser to parse two different files having same definition but varies in the number of column count使用 Univocity CSV 解析器解析两个具有相同定义但列数不同的不同文件
【发布时间】:2016-08-19 14:17:44
【问题描述】:

我正在使用 Univocity 解析器来解析 CSV 文件并将它们填充到 Bean 中。

我面临的问题是我有两个不同的文件。这两个文件的结构相同,但列数不同。它们都引用同一个 Bean 类。

例如:

File A contains(without header):
I|123|Hello
U|345|Hi

File B contains(without header):
123|Hello
345|Hi

Bean 类定义为:

public class Bean {
    @Trim
    @Parsed(index = 0)
    protected String action;

    @Trim
    @Parsed(index = 1)
    protected Long id;

    @Trim
    @Parsed(index = 2)
    protected String name;

    ......................
}

如果我对这两个文件使用相同的 bean,则期望两个文件中的列数相同,但它会失败。

我认为我可以使用的另一种方法是为不同的文件集使用两个不同的 bean,但我正在查看 Univocity 解析器中是否有任何功能来处理这种情况。

请帮忙。谢谢。

【问题讨论】:

  • @JeronimoBackes.. 你能帮忙吗?

标签: java csv parsing univocity


【解决方案1】:

您可以在解析每个输入之前“手动”设置标题。例如:

    CsvParserSettings s = new CsvParserSettings();
    s.setHeaderExtractionEnabled(false);
    CsvRoutines r = new CsvRoutines(s);

    //set headers of input with 3 columns
    s.setHeaders("action" , "id", "name");
    for(Bean b : r.iterate(Bean.class, new StringReader("I,123,Hello\nU,345,Hi"))){
        System.out.println(b);
    }

    //set headers of input with 2 columns
    s.setHeaders("id", "name");
    for(Bean b : r.iterate(Bean.class, new StringReader("123,Hello\n345,Hi"))){
        System.out.println(b);
    }

如果您将 bean 更改为使用标题名称而不是列位置,上述方法将起作用:

public class Bean {
    @Trim
    @Parsed
    protected String action;

    @Trim
    @Parsed
    protected Long id;

    @Trim
    @Parsed
    protected String name;

我得到了以下输出(在将toString() 方法添加到Bean 类之后):

Bean{action='I', id=123, name='Hello'}
Bean{action='U', id=345, name='Hi'}
Bean{action='null', id=123, name='Hello'}
Bean{action='null', id=345, name='Hi'}

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2018-05-09
    • 2011-11-04
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多