使用 Apache Camel Spring XML 将 CSV 加载到数据库(CSV 到 SQL 组件)
Load CSV to database using Apache Camel Spring XML (CSV to SQL components)
我想做一个简单的文件轮询,它接收一个 CSV 文件,将其解组并将特定字段加载到数据库中。我想这应该是一个很常见的场景,但我需要使用 Spring XML 而不是创建 java 处理器。令我惊讶的是,我发现很难在整个互联网上找到任何关于它的例子。可能我只是没找对地方,但值得一提的是,我正在分享我的问题和我自己的答案,以防其他人发现它有用。
这是我想要实现的目标:
- 自动从文件夹中选择 CSV 文件。
- 将特定字段从 CSV 加载到 table
CSV 看起来像这样
ID,KEY,FULLNAME,DOCID
1,1,PERSON1,THY
2,1,PERSON2,XCV
3,1,PERSON3,OIU
4,1,PERSON4,KJM
需要保存到 table(仅 ID 和 FULLNAME 字段):
个人
ID
NAME
1
PERSON1
2
PERSON2
3
PERSON3
4
PERSON4
我正在使用 Camel 3.14.0。
Spring XML 对我有用的 DSL 路由:
<route>
<from uri="file://D:\path?include=(?i).*.csv&moveFailed=ErrorFiles&delay=5000"/>
<unmarshal>
<csv captureHeaderRecord="true" useMaps="true"/>
</unmarshal>
<!-- Clear contents from destination table. -->
<to uri="sql:DELETE FROM PERSON?datasource=#customerDS&noop=true"/>
<split> <!--Split unmarshalled body in individual maps that will be sent one by one to sql component -->
<simple>${body}</simple> <!--As unmarshal is a List <Map> then this automatically gets list split in individual maps I guess -->
<log message="Record being processed: ${body}" loggingLevel="INFO"/>
<to uri="sql:INSERT INTO PERSON(ID,NAME) VALUES(:#ID,:#FULLNAME)?dataSource=#customerDS" />
</split>
</route>
我想做一个简单的文件轮询,它接收一个 CSV 文件,将其解组并将特定字段加载到数据库中。我想这应该是一个很常见的场景,但我需要使用 Spring XML 而不是创建 java 处理器。令我惊讶的是,我发现很难在整个互联网上找到任何关于它的例子。可能我只是没找对地方,但值得一提的是,我正在分享我的问题和我自己的答案,以防其他人发现它有用。
这是我想要实现的目标:
- 自动从文件夹中选择 CSV 文件。
- 将特定字段从 CSV 加载到 table
CSV 看起来像这样
ID,KEY,FULLNAME,DOCID
1,1,PERSON1,THY
2,1,PERSON2,XCV
3,1,PERSON3,OIU
4,1,PERSON4,KJM
需要保存到 table(仅 ID 和 FULLNAME 字段):
个人
ID | NAME |
---|---|
1 | PERSON1 |
2 | PERSON2 |
3 | PERSON3 |
4 | PERSON4 |
我正在使用 Camel 3.14.0。
Spring XML 对我有用的 DSL 路由:
<route>
<from uri="file://D:\path?include=(?i).*.csv&moveFailed=ErrorFiles&delay=5000"/>
<unmarshal>
<csv captureHeaderRecord="true" useMaps="true"/>
</unmarshal>
<!-- Clear contents from destination table. -->
<to uri="sql:DELETE FROM PERSON?datasource=#customerDS&noop=true"/>
<split> <!--Split unmarshalled body in individual maps that will be sent one by one to sql component -->
<simple>${body}</simple> <!--As unmarshal is a List <Map> then this automatically gets list split in individual maps I guess -->
<log message="Record being processed: ${body}" loggingLevel="INFO"/>
<to uri="sql:INSERT INTO PERSON(ID,NAME) VALUES(:#ID,:#FULLNAME)?dataSource=#customerDS" />
</split>
</route>