首页 > 解决方案 > 使用 RowProcessor (Univocity) 解析固定宽度的文件

问题描述

我正在处理一个具有 3 种不同类型 bean 的固定宽度文件:

我尝试了 Univocity 的许多选项,但问题是在解析步骤之后,processor.getBeans() 方法总是为每种类型的 bean 返回一个空列表。

有谁能够帮我 ?

        FixedWidthParserSettings settings = new FixedWidthParserSettings();
        settings.setAutoConfigurationEnabled(true);
        settings.setHeaderExtractionEnabled(false);
        settings.setRecordEndsOnNewline(true);
        settings.trimValues(false);
        
        FixedWidthFields header = FixedWidthFields.forParsing(Header0256Q.class);
        FixedWidthFields payment = FixedWidthFields.forParsing(Payment0768T.class);
        FixedWidthFields footer = FixedWidthFields.forParsing(Footer0256Z.class);
        

展望

        settings.addFormatForLookahead("0256Q", header);
        settings.addFormatForLookahead("0768T", payment);
        settings.addFormatForLookahead("0256Z", footer);
        

为每种类型的记录创建一个处理器

        BeanListProcessor<Header0256Q> headerProcessor = new BeanListProcessor<Header0256Q>(Header0256Q.class);
        BeanListProcessor<Payment0768T> paymentProcessor = new BeanListProcessor<Payment0768T>(Payment0768T.class);
        BeanListProcessor<Footer0256Z> footerProcessor = new BeanListProcessor<Footer0256Z>(Footer0256Z.class);
        

输入值开关

        InputValueSwitch inputValueSwitch = new InputValueSwitch();
       
        inputValueSwitch.addSwitchForValue("0256Q", headerProcessor);
        inputValueSwitch.addSwitchForValue("0768T", paymentProcessor);
        inputValueSwitch.addSwitchForValue("0256Z", footerProcessor);
       
        settings.setProcessor(inputValueSwitch);

解析

        FixedWidthParser parser = new FixedWidthParser(settings);
        parser.parse(lFile);

获取豆子

        List<Header0256Q> headerRecords = headerProcessor.getBeans();
        List<Payment0768T> paymentRecords = paymentProcessor.getBeans();
        List<Footer0256Z> footerRecords = footerProcessor.getBeans();
        

使用返回的 bean 映射文件

        Dtazv dtazv = new Dtazv();
        dtazv.setHeaderRecord(headerRecords.get(0));
        dtazv.setPaymentRecords(paymentRecords);
        dtazv.setFooterRecord(footerRecords.get(0));

标签: parsingfixed-widthunivocity

解决方案


推荐阅读