如何使用 Beanio 按行过滤读取 CSV 文件?

How read CSV file filtering by line with Beanio?

我想用 BeanIO 读取 CSV 文件,我只希望以“CA”开头的行跳过其余行。我需要“CA”行的值“0”“1”“2”和“3”“4”“5”

AA123
BA456
CA789
CA012
CA345
DA678
EA901

BeanIO 有一个 XML 映射器。

<stream name="InfoCSV" format="csv">
  <record name="info" class="com.example.Info" minOccurs="0" maxOccurs="unbounded">
    <field name="digit1" />
    <field name="digit2" />
    <field name="digit3" />
  </record>
</stream>

如何过滤行?我不知道 XML 解析器

是怎么做的

首先,根据您显示的数据,您必须使用 fixedlength 格式解析器而不是 csv:

<stream name="InfoCSV" format="fixedlength" />

Appendix A par 7 Streams 有一个名为 ignoreUnidentifiedRecords 的配置设置,您需要忽略不以“CA”开头的 records/lines。

您还需要告诉解析器如何识别您感兴趣的 record/lines。Section 4.2.1 解释记录识别如何与 rid="true"literal 属性一起使用.如果我们假设前 2 个字符标识您感兴趣的 record/line,我们有:

<field name="id" position="0" length="2" rid="true" literal="CA" />

综合起来:

<stream name="InfoCSV" format="fixedlength" ignoreUnidentifiedRecords="true">
  <record name="info" class="com.example.Info" minOccurs="0" maxOccurs="unbounded">
    <field name="id" position="0" length="2" rid="true" literal="CA"/>
    <field name="digit1" position="2" length="1" />
    <field name="digit2" position="3" length="1" />
    <field name="digit3" position="4" length="1" />
  </record>
</stream>