当我们尝试使用BeanIO读取多重输入格式时,如何编写mapping.xml文件



我的输入文件有多种格式。我的第一行将被分隔,剩下的文件将是固定长度的。

如何编写映射xml文件并从java中读取它?

我试着写多个流,但没有成功。

我的mapping.xml是这样的,

<beanio xmlns="http://www.beanio.org/2012/03"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.beanio.org/2012/03 http://www.beanio.org/2012/03/mapping.xsd">
<stream name="ebcdicFile" format="delimited">
<parser>
<property name="delimiter" value="|" />
</parser>
<record name="header"
class="sft_action_cms_apt_394.sft_action_cms_apt_394.FileSegment">
<field name="fileName" />
<field name="batchCount" />
<field name="totalRecords" />
<field name="maxBatchSize" />
<field name="pickUpTime" />
<field name="errorFlag" />
</record>
</stream>
<stream name="file" format="fixedlength">
<record name="dec"
class="sft_action_cms_apt_394.sft_action_cms_apt_394.pojo">
<field name="tag" length="4" />
<field name="description" length="unbounded" />
</record>
</stream>
</beanio>

我不认为BeanIO涵盖了您的用例。我会尝试这样做:

  • 请确保使用支持标记&重置。一个例子是标准java.io.BufferedReader
  • 首先在BufferedReader的输入上输入mark()您当前的位置
  • 读取所需的尽可能多的数据,以手动确定要使用2个BeanIO流中的哪一个来读取数据并将其转换为对象
  • 现在reset()就是BufferedReader,这将使它"返回"到与您调用mark()相同的点
  • 现在使用BeanIO读取您的数据

您可能需要重复上述过程或根据数据结构进行调整。您不会显示您的"标头"是单个记录,还是在"dec"记录之间可以多次出现。

如果你只有一个"头"记录,然后有多个"dec"记录,你可以用这样的东西来简化上面的过程

  • 使用BufferedReader.readLine()方法将数据的第一行直接读取到String中。将此字符串传递给BeanIO读取器以对其进行解析,并返回"头"对象。

    String firstLine = bufferedReader.readLine();
    BeanReader beanReader = null;
    FileSegment fileSegment = null;
    try (Reader in = new BufferedReader(new StringReader(firstLine))) {
    beanReader = factory.createReader("ebcdicFile", in);
    fileSegment = (FileSegment)beanReader.read();
    }
    
  • 现在,您可以创建另一个BeanReader来使用"文件"流读取其余的输入数据。

最新更新