Фиксированный формат файла - PullRequest
0 голосов
/ 13 июня 2019

Я читаю данные из файла фиксированной длины.

Это содержимое файла:
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 и нанимал как ноль.

Как я могу это прочитать?

1 Ответ

0 голосов
/ 13 июня 2019

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

...