讲师中心 微信公众号
AI工具推荐 视频效率加速

Apache Camel Bindy:如何跳过 CSV 解析中的无效记录

夜伟姑娘_1673

夜伟姑娘_1673

发布时间:2026-10-14 08:54:05

|

278人浏览过

|

来源于php中文网

原创

Apache Camel Bindy:如何跳过 CSV 解析中的无效记录

在使用 Apache Camel Bindy 解析 CSV 文件时,遇到格式错误(如非数字字段)会导致 NumberFormatException 并中断整个路由;本文介绍两种健壮方案——正则预过滤与自定义容错 DataFormat,实现自动跳过非法行并继续处理有效记录。

在使用 apache camel bindy 解析 csv 文件时,遇到格式错误(如非数字字段)会导致 `numberformatexception` 并中断整个路由;本文介绍两种健壮方案——正则预过滤与自定义容错 dataformat,实现自动跳过非法行并继续处理有效记录。

Apache Camel 的 BindyDataFormat 默认不具备容错能力:一旦某一行数据无法映射(例如将字符串 "Test" 赋值给 double sellRate 字段),便会抛出 NumberFormatException,导致当前 Exchange 失败,且后续记录也无法处理。为保障批量解析的稳定性,推荐以下两种生产级解决方案:

✅ 方案一:前置正则过滤(推荐 · 简单高效)

利用 .split() + .filter() 在反序列化前对原始 CSV 行进行语法校验,仅让符合格式的行进入 Bindy 流程:

from("file:" + baseInputPath + "/exchangerates" + "?noop=true")
    .idempotentConsumer(header(CAMEL_FILE_NAME),
        FileIdempotentRepository.fileIdempotentRepository(
            new File(baseInputPath + "/tracker/exchangeratefiles.txt")))
    .log("Processing exchange rate file: ${header.CamelFileName}")
    // 按行切分,并过滤掉不匹配格式的记录
    .split(body().tokenize("
"))
        .streaming() // 启用流式处理,避免内存积压
        .filter(simple("${body} regex '^[A-Z]{3}\*[^*]+\*[0-9.]+\*[0-9.]+\*[0-9.]+$'"))
            .unmarshal().bindy(BindyType.Csv, ExchangeRateBindy.class)
            .process(exchange -> {
                ExchangeRateBindy bindy = exchange.getIn().getBody(ExchangeRateBindy.class);
                if (bindy != null) {
                    exchangeRateService.save(bindy.toExchangeRate());
                }
            })
        .end(); // 结束 filter 分支

? 正则说明:^[A-Z]{3}\*[^*]+\*[0-9.]+\*[0-9.]+\*[0-9.]+$

  • ^[A-Z]{3}:货币代码(3位大写字母)
  • \*:字面量星号分隔符
  • [^*]+:货币名称(不含 * 的任意字符)
  • [0-9.]+:三次浮点数格式(支持 1.0332 或 812.7459194)
  • $:确保整行匹配,防止部分匹配干扰

✅ 优势:零侵入 Bindy,逻辑清晰,性能高,天然跳过非法行,无需异常捕获。

QuickBooks Mileage CSV
QuickBooks Mileage CSV

使用 qbo-mileage CLI 及用户凭证,从 Airtable、Outlook 或 Google Calendar 记录生成 QuickBooks Online 里程 CSV 文件。

下载

✅ 方案二:封装容错型 Bindy DataFormat(高级 · 灵活可控)

若需更精细控制(如记录错误行、动态 fallback 值),可封装一个 FaultTolerantBindyCsvDataFormat:

public class FaultTolerantBindyCsvDataFormat extends BindyCsvDataFormat {
    public FaultTolerantBindyCsvDataFormat(Class<?> type) {
        super(type);
    }

    @Override
    public Object unmarshal(Exchange exchange, InputStream stream) throws Exception {
        List<String> lines = IOUtils.readLines(stream, "UTF-8");
        List<Object> validObjects = new ArrayList<>();
        for (String line : lines) {
            if (line.trim().isEmpty()) continue;
            try {
                // 使用父类逻辑逐行解析
                Object obj = super.unmarshal(exchange, new ByteArrayInputStream(line.getBytes(StandardCharsets.UTF_8)));
                validObjects.add(obj);
            } catch (Exception e) {
                log.warn("Skipped invalid CSV line: '{}', cause: {}", line, e.getMessage());
                // 跳过该行,不中断流程
            }
        }
        return validObjects;
    }
}

在路由中使用:

.unmarshal(new FaultTolerantBindyCsvDataFormat(ExchangeRateBindy.class))
.process(exchange -> {
    List<ExchangeRateBindy> list = exchange.getIn().getBody(List.class);
    if (list != null) {
        list.forEach(bindy -> exchangeRateService.save(bindy.toExchangeRate()));
    }
});

⚠️ 注意事项:

  • 使用 .split().streaming() 可显著降低内存占用,尤其适用于大文件;
  • 正则过滤需严格匹配实际 CSV 格式(注意转义 * 为 \*);
  • 若 CSV 含引号包裹字段或换行符,正则方案需升级为完整 CSV 解析器(如 OpenCSV)预检;
  • skipFirstLine = false 时,请确保首行无标题;若含标题,建议设为 true 或在正则中排除首行。

通过上述任一方式,您即可实现「失败隔离」:单条记录错误不再阻塞全局处理,系统鲁棒性与可观测性同步提升。

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

10397

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

7522

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

6592

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1124

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

928

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

1376

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2729

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

20051

2023.08.03

VibeKnow知识视频制作与导出详解
VibeKnow知识视频制作与导出详解

本专题整理VibeKnow从注册、素材上传、AI生成到预览导出的完整操作,帮助新手快速制作第一条知识讲解视频。

0

2026.10.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Apache Maven 官方安装指南
Apache Maven 官方安装指南

共0课时 | 0人学习

Apache Maven 官方用户中心
Apache Maven 官方用户中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn