我正在从固定长度的文件读取数据。
这是文件内容:
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 和雇用日期作为空一样。
我该如何阅读此内容?
我能得到的最好的就是让它为缺少的字段分配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 正确解析