Лучшее, что я могу получить - это присвоить 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