1

我正在从固定长度文件中读取数据。

这是文件内容:
Joe Smith Developer 075000 10012009

这是映射文件:

    <beanio>

      <stream name="employeeFile" format="fixedlength">
        <record name="employee" class="Employee" minOccurs="0" maxOccurs="unbounded">
          <field name="firstName" length="10" />
          <field name="lastName" length="10" />
          <field name="title" length="10" />
          <field name="salary"  length="6" />
          <field name="hireDate" format="MMddyy"  minOccurs="0" length="unbounded" maxLength="8"/>
        </record> 
      </stream>

    </beanio>

输出:

    First Name:Joe
    Last Name:Smith    
    Title:Developer 
    Salary:75000
    Hire Date:Thu Oct 01 00:00:00 IST 2009

代码正在读取文件并成功转换为 pojo。现在客户需要我正在努力实施的奇怪要求。

"Joe Smith Developer 075000 10012009"如果最后一个值没有出现或部分出现,则从文件内容中,代码应该成功读取内容。

例如:如果文件的内容如"Joe Smith Developer 0750". 这里工资长度为 4,但我们在映射文件中声明为 6,并且没有雇用日期数据。尽管如此,代码应该可以成功读取它,就像它应该将薪水设为 0750 并将雇佣日期设为空一样。

我怎样才能读到这个?

4

1 回答 1

1

我能得到的最好的方法是让它null为丢失的字段分配值。当字段的任何部分出现时,该字段的整个长度必须出现在数据中。这是固定长度格式的本质。

使用此映射文件:

<beanio>
  <stream name="employeeFile" format="fixedlength">
    <record name="employee" class="Employee" minOccurs="0" maxOccurs="unbounded">
      <field name="firstName" length="10"/>
      <field name="lastName" length="10"/>
      <field name="title" length="10"/>
      <field name="salary" length="6" minOccurs="0"/>
      <field name="hireDate" format="MMddyyyy" length="8" minOccurs="0"/>
    </record>
  </stream>
</beanio>

您将能够读取数据,例如:

Joe1      Smith     Developer 07500010012009
Joe3      Smith     Developer 

输出:

Employee(firstName=Joe1, lastName=Smith, title=Developer, salary=075000, hireDate=Thu Oct 01 00:00:00 SAST 2009)
Employee(firstName=Joe3, lastName=Smith, title=Developer, salary=null, hireDate=null)

但是这条线不起作用(如您所知,因此是这个问题的原因)

Joe2      Smith     Developer 0750

您要么必须告诉提供数据的人员/公司符合数据规范,要么必须先操作数据,然后才能使用 BeanIO 读取数据。否则,数据必须以某种可变长度格式提供,例如 CSV、管道分隔或 XML,然后您可以使用 BeanIO 正确解析

于 2019-06-13T16:20:26.720 回答