Apache camel 通过映射列表使用Apache Camel将CSV文件转换为JSON文件
目标是学习如何将CSV读入映射列表,然后如何将其封送到JSON 一旦我了解了怎么做,我就会知道如何定义更有用的路由 我使用XML定义路由,另一个限制是不创建任何转换bean,而只使用现有组件 我的理解显然缺乏一些概念。我知道你必须作为消费者提供一个bean,然后你可以把它传下去;但是文档中说csv数据格式使用的地图列表有什么问题Apache camel 通过映射列表使用Apache Camel将CSV文件转换为JSON文件,apache-camel,Apache Camel,目标是学习如何将CSV读入映射列表,然后如何将其封送到JSON 一旦我了解了怎么做,我就会知道如何定义更有用的路由 我使用XML定义路由,另一个限制是不创建任何转换bean,而只使用现有组件 我的理解显然缺乏一些概念。我知道你必须作为消费者提供一个bean,然后你可以把它传下去;但是文档中说csv数据格式使用的地图列表有什么问题 <dataFormats> <json id="jack" library="Jackson"/> </d
<dataFormats>
<json id="jack" library="Jackson"/>
</dataFormats>
<route>
<from uri="file:///C:/tries/collApp/exchange/in?fileName=registerSampleSmaller.csv"/>
<unmarshal>
<csv />
</unmarshal>
<marshal ref="jack">
</marshal>
<to uri="file:///C:/tries/collApp/exchange/out?fileName=out.json"/>
</route>
默默地什么也不做。我只能看到锁文件是如何出现和消失的
谢谢
ps/我期待着创建两条路径,第一条路径将读取csv,将其转换为我的持久bean的扁平特性,然后将其传递给我的bean。第二个将把我的bean保存为json,这似乎是一个简单的部分;但我首先需要这样做才能理解它是如何工作的请看一下这个DataFormat页面[1] 您可以使用这些封送DSL将对象转换为具有所需格式的字符串。
[1] 为什么要地图列表?为什么不列一份清单呢
如果您需要代码示例,请告诉我。但是主要的想法是在解开csv后始终检查主体。您很可能会得到pojo的列表。然后迭代列表,对于每个pojo,获取“getter”并设置json标记的值。我在前面提供了一个答案 我在正确的轨道上,只是有一些小错误。其中一个是由Jérémie B在对原始问题的评论中注意到的 由于我没有启用日志记录,所以它以静默方式失败,我通过在pom.xml中添加slf4j实现了这一点:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>${slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j-version}</version>
</dependency>
org.slf4j
)
虽然我前进了,但可能现在我绕过了有缺陷的Camel的IOConverter,目前我正处于这一阶段(这不是对问题的回答,只是为了说明Camel有多方便):
${body.size()}==1
#{
{
lastName:body[0][“LAST_NAME”],
firstName:body[0]['FIRST_NAME'],
赞助人:主体[0][“赞助人”],
注释:正文[0]['COMMENT6']
}
}
我必须编写自己的CSV拆分器(关于所有Unicode代码点等),它基本上是将第一行添加到所有后续行中,但现在我能够以流线型的方式将CSV拆分为一组JSON,或者以不同的方式处理对象,而不是编组
**更新-CSVSPLITER代码**
读取器标记器-读取器周围的迭代器:
public class ReaderTokenizer implements Iterator<String> {
private String _curString = null;
private boolean _endReached = false;
private final Reader _reader;
private char[] _token;
public ReaderTokenizer(Reader reader, String token) {
setToken(token);
_reader = reader;
}
public final void setToken(String token){
_token = token.toCharArray();
if(_token.length==0){
throw new IllegalArgumentException("Can't tokenize with the empty string");
}
}
private void _readNextToken() throws IOException {
int curCharInt;
char previousChar = (char) -1;
int tokenPos = 0;
StringBuilder sb = new StringBuilder(255);
while (true) {
curCharInt = _reader.read();
if (curCharInt == -1) {
_endReached = true;
_reader.close();
break;
}
if (curCharInt == _token[tokenPos]) {
if (tokenPos != 0 || !Character.isHighSurrogate(previousChar)) {
tokenPos++;
if (tokenPos >= _token.length) {
tokenPos = 0;
previousChar = (char) curCharInt;
sb.append(previousChar);
break;
}
}
}
previousChar = (char) curCharInt;
sb.append(previousChar);
}
_curString = sb.toString();
}
@Override
public boolean hasNext() {
if (_curString == null) {
if (_endReached) {
return false;
}
try {
_readNextToken();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
if (_curString != null) {
return true;
}
if (_endReached) {
return false;
}
throw new RuntimeException("Someting wrong");
} else {
return true;
}
}
@Override
public String next() {
if (_curString != null) {
String ret = _curString;
_curString = null;
return ret;
}
if (_endReached) {
throw new NoSuchElementException();
}
try {
_readNextToken();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
if (_curString != null) {
String ret = _curString;
_curString = null;
return ret;
}
throw new RuntimeException("Someting wrong");
}
@Override
public void remove() {
throw new UnsupportedOperationException("Not supported.");
}
}
公共类ReaderTokenizer实现迭代器{
私有字符串_curString=null;
私有布尔值_endreach=false;
私人最终读取器(u读取器);;
私有字符[]_令牌;
公共读卡器(读卡器,字符串标记){
setToken(token);
_读取器=读取器;
}
公共最终无效集合令牌(字符串令牌){
_token=token.toCharArray();
如果(_token.length==0){
抛出新的IllegalArgumentException(“不能用空字符串标记”);
}
}
私有void\u readNextToken()引发IOException{
int curCharInt;
char-previousChar=(char)-1;
int-tokenPos=0;
StringBuilder sb=新的StringBuilder(255);
while(true){
curCharInt=_reader.read();
如果(curCharInt==-1){
_endreach=true;
_reader.close();
打破
}
if(curCharInt==\u令牌[tokenPos]){
if(tokenPos!=0 | |!Character.ishighsrogate(previousChar)){
tokenPos++;
if(tokenPos>=\u token.length){
tokenPos=0;
previousChar=(char)curCharInt;
某人附加(先前的字符);
打破
}
}
}
previousChar=(char)curCharInt;
某人附加(先前的字符);
}
_curString=sb.toString();
}
@凌驾
公共布尔hasNext(){
if(_curString==null){
如果(_endreach){
返回false;
}
试一试{
_readNextToken();
}捕获(IOEX异常){
抛出新的运行时异常(ex);
}
如果(_curString!=null){
返回true;
}
如果(_endreach){
返回false;
}
抛出新的RuntimeException(“出错”);
}否则{
返回true;
}
}
@凌驾
公共字符串next(){
如果(_curString!=null){
字符串ret=\u curString;
_curString=null;
返回ret;
}
如果(_endreach){
抛出新的NoTouchElementException();
}
试一试{
_readNextToken();
}捕获(IOEX异常){
抛出新的运行时异常(ex);
}
如果(_curString!=null){
字符串ret=\u curString;
_curString=null;
返回ret;
}
抛出新的RuntimeException(“出错”);
}
@凌驾
公共空间删除(){
抛出新的UnsupportedOperationException(“不受支持”);
}
}
拆分器本身:
public class CamelReaderSplitter {
private final String _token;
private final int _headerLinesNumber;
public CamelReaderSplitter(String token, int headerLinesNumber) {
_token = token;
_headerLinesNumber = headerLinesNumber;
}
public CamelReaderSplitter(String token) {
_token = token;
_headerLinesNumber = 1;
}
public CamelReaderSplitter(int headerLinesNumber) {
_token = "\r\n";
_headerLinesNumber = headerLinesNumber;
}
public CamelReaderSplitter() {
_token = "\r\n";
_headerLinesNumber = 1;
}
public Iterator<String> tokenizeReader(final Reader reader) throws IOException {
Iterator<String> ret = new ReaderTokenizer(reader, _token) {
private final String _firstLines;
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < _headerLinesNumber; i++) {
if (super.hasNext()) {
sb.append(super.next());
}
}
_firstLines = sb.toString();
}
@Override
public String next() {
return _firstLines + super.next();
}
};
return ret;
}
}
公共类camelReaderSpliter{
私有最终字符串\u标记;
私人最终国际校长行成员;
公共CamelReaderSpliter(字符串标记,i
public class ReaderTokenizer implements Iterator<String> {
private String _curString = null;
private boolean _endReached = false;
private final Reader _reader;
private char[] _token;
public ReaderTokenizer(Reader reader, String token) {
setToken(token);
_reader = reader;
}
public final void setToken(String token){
_token = token.toCharArray();
if(_token.length==0){
throw new IllegalArgumentException("Can't tokenize with the empty string");
}
}
private void _readNextToken() throws IOException {
int curCharInt;
char previousChar = (char) -1;
int tokenPos = 0;
StringBuilder sb = new StringBuilder(255);
while (true) {
curCharInt = _reader.read();
if (curCharInt == -1) {
_endReached = true;
_reader.close();
break;
}
if (curCharInt == _token[tokenPos]) {
if (tokenPos != 0 || !Character.isHighSurrogate(previousChar)) {
tokenPos++;
if (tokenPos >= _token.length) {
tokenPos = 0;
previousChar = (char) curCharInt;
sb.append(previousChar);
break;
}
}
}
previousChar = (char) curCharInt;
sb.append(previousChar);
}
_curString = sb.toString();
}
@Override
public boolean hasNext() {
if (_curString == null) {
if (_endReached) {
return false;
}
try {
_readNextToken();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
if (_curString != null) {
return true;
}
if (_endReached) {
return false;
}
throw new RuntimeException("Someting wrong");
} else {
return true;
}
}
@Override
public String next() {
if (_curString != null) {
String ret = _curString;
_curString = null;
return ret;
}
if (_endReached) {
throw new NoSuchElementException();
}
try {
_readNextToken();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
if (_curString != null) {
String ret = _curString;
_curString = null;
return ret;
}
throw new RuntimeException("Someting wrong");
}
@Override
public void remove() {
throw new UnsupportedOperationException("Not supported.");
}
}
public class CamelReaderSplitter {
private final String _token;
private final int _headerLinesNumber;
public CamelReaderSplitter(String token, int headerLinesNumber) {
_token = token;
_headerLinesNumber = headerLinesNumber;
}
public CamelReaderSplitter(String token) {
_token = token;
_headerLinesNumber = 1;
}
public CamelReaderSplitter(int headerLinesNumber) {
_token = "\r\n";
_headerLinesNumber = headerLinesNumber;
}
public CamelReaderSplitter() {
_token = "\r\n";
_headerLinesNumber = 1;
}
public Iterator<String> tokenizeReader(final Reader reader) throws IOException {
Iterator<String> ret = new ReaderTokenizer(reader, _token) {
private final String _firstLines;
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < _headerLinesNumber; i++) {
if (super.hasNext()) {
sb.append(super.next());
}
}
_firstLines = sb.toString();
}
@Override
public String next() {
return _firstLines + super.next();
}
};
return ret;
}
}