Java ApacheCamel-SQL到CSV

Java ApacheCamel-SQL到CSV,java,xml,csv,apache-camel,blueprint-osgi,Java,Xml,Csv,Apache Camel,Blueprint Osgi,我已尝试将sql结果转换为csv文件 这是路线(bluprint.xml): 这是用于创建csv格式的transformer类: public class transformer { public void tocsv(Exchange exchange) { StringBuilder csv = new StringBuilder(); List received =

我已尝试将sql结果转换为csv文件 这是路线(bluprint.xml):


这是用于创建csv格式的transformer类:

    public class transformer {
            public void tocsv(Exchange exchange)
            {
                StringBuilder csv = new StringBuilder();
                List received = exchange.getIn().getBody(List.class);
                for (int i = 0; i < received.size(); i++) 
                 {
                   Map<String,Object> row = (Map<String,Object>) received.get(i);
                   csv.append(row.get("id"));
                   csv.append(",").append(row.get("lastname"));
                   csv.append(",").append(row.get("firstname"));
                   csv.append("\r");
                 }
            }
        }
公共类转换器{
公开作废tocsv(交易所)
{
StringBuilder csv=新的StringBuilder();
接收列表=exchange.getIn().getBody(List.class);
对于(int i=0;i
在这种情况下,我应该知道字段的名称(如id、lastname…),并且我想使用索引 而是因为表或字段可以更改


如何使用索引而不是名称字段?

找到一个小片段,说明它不能像您所说的那样工作

List<Map<String, Object>> received = new ArrayList<>();
Map<String, Object> rowOne = new HashMap<>();
rowOne.put("id", 42);
rowOne.put("lastname", "Doe");
rowOne.put("firstname", "John");
Map<String, Object> rowTwo = new HashMap<>();
rowTwo.put("id", 23);
rowTwo.put("lastname", "Doe");
rowTwo.put("firstname", "Jane");
received.add(rowOne);
received.add(rowTwo);
StringBuilder csv = new StringBuilder();
for (Map<String, Object> i : received) {
    StringJoiner line = new StringJoiner(",");
    for (Map.Entry<String, Object> j : i.entrySet()) {
        line.add(j.getValue().toString());
    }
    csv.append(line.toString()).append("\n");
}
System.out.println(csv);
值的顺序取决于列的名称和映射的类型

如果使用
TreeMap
,则可能会强制SQL语句返回的列的名称按您希望的顺序输出(我不建议这样做)

请看这个小片段来说明这个想法

List<Map<String, Object>> received = new ArrayList<>();
Map<String, Object> rowOne = new TreeMap<>();
rowOne.put("1id", 42);
rowOne.put("2lastname", "Doe");
rowOne.put("3firstname", "John");
Map<String, Object> rowTwo = new TreeMap<>();
rowTwo.put("id", 23);
rowTwo.put("lastname", "Doe");
rowTwo.put("firstname", "Jane");
received.add(rowOne);
received.add(rowTwo);
StringBuilder csv = new StringBuilder();
for (Map<String, Object> i : received) {
    StringJoiner line = new StringJoiner(",");
    for (Map.Entry<String, Object> j : i.entrySet()) {
        line.add(j.getValue().toString());
    }
    csv.append(line.toString()).append("\n");
}
System.out.println(csv);

找一个小片段来说明它不能像你所说的那样工作

List<Map<String, Object>> received = new ArrayList<>();
Map<String, Object> rowOne = new HashMap<>();
rowOne.put("id", 42);
rowOne.put("lastname", "Doe");
rowOne.put("firstname", "John");
Map<String, Object> rowTwo = new HashMap<>();
rowTwo.put("id", 23);
rowTwo.put("lastname", "Doe");
rowTwo.put("firstname", "Jane");
received.add(rowOne);
received.add(rowTwo);
StringBuilder csv = new StringBuilder();
for (Map<String, Object> i : received) {
    StringJoiner line = new StringJoiner(",");
    for (Map.Entry<String, Object> j : i.entrySet()) {
        line.add(j.getValue().toString());
    }
    csv.append(line.toString()).append("\n");
}
System.out.println(csv);
值的顺序取决于列的名称和映射的类型

如果使用
TreeMap
,则可能会强制SQL语句返回的列的名称按您希望的顺序输出(我不建议这样做)

请看这个小片段来说明这个想法

List<Map<String, Object>> received = new ArrayList<>();
Map<String, Object> rowOne = new TreeMap<>();
rowOne.put("1id", 42);
rowOne.put("2lastname", "Doe");
rowOne.put("3firstname", "John");
Map<String, Object> rowTwo = new TreeMap<>();
rowTwo.put("id", 23);
rowTwo.put("lastname", "Doe");
rowTwo.put("firstname", "Jane");
received.add(rowOne);
received.add(rowTwo);
StringBuilder csv = new StringBuilder();
for (Map<String, Object> i : received) {
    StringJoiner line = new StringJoiner(",");
    for (Map.Entry<String, Object> j : i.entrySet()) {
        line.add(j.getValue().toString());
    }
    csv.append(line.toString()).append("\n");
}
System.out.println(csv);

我知道你可以通过一些调整使上面的代码工作,但我想我会提出一个建议,使整个问题对你来说更容易。Camel SQL组件允许您自动将数据库响应映射回对象。语法如下:

from("sql:select * from performances?dataSource=afbl_source?outputType=SelectList&outputClass=com.myapp.MyDatabaseModel")
// Camel 2.15 or older (configure by package name)
BindyCsvDataFormat bindy = new BindyCsvDataFormat("com.myapp");
// Camel 2.16 onwards (configure by class name)
BindyCsvDataFormat bindy = new BindyCsvDataFormat(com.myapp.MyDatabaseModel.class);

.marshal(bindy)
一旦你有了这个设置,你会在你的骆驼身体里得到一个物体

List<MyDatabaseModel>
对Bindy的调用设置如下:

from("sql:select * from performances?dataSource=afbl_source?outputType=SelectList&outputClass=com.myapp.MyDatabaseModel")
// Camel 2.15 or older (configure by package name)
BindyCsvDataFormat bindy = new BindyCsvDataFormat("com.myapp");
// Camel 2.16 onwards (configure by class name)
BindyCsvDataFormat bindy = new BindyCsvDataFormat(com.myapp.MyDatabaseModel.class);

.marshal(bindy)
将所有这些放在一起,您可以将项目分解为两行camel和一个java对象来完成此任务。“下面是完整的骆驼”

我想我还应该提到,如果您不想过于担心csv订单的配置,您实际上可以跳过整个注释过程,只需执行以下操作:

marshal().csv();

我知道你可以通过一些调整使上面的代码工作,但我想我会提出一个建议,使整个问题对你来说更容易。Camel SQL组件允许您自动将数据库响应映射回对象。语法如下:

from("sql:select * from performances?dataSource=afbl_source?outputType=SelectList&outputClass=com.myapp.MyDatabaseModel")
// Camel 2.15 or older (configure by package name)
BindyCsvDataFormat bindy = new BindyCsvDataFormat("com.myapp");
// Camel 2.16 onwards (configure by class name)
BindyCsvDataFormat bindy = new BindyCsvDataFormat(com.myapp.MyDatabaseModel.class);

.marshal(bindy)
一旦你有了这个设置,你会在你的骆驼身体里得到一个物体

List<MyDatabaseModel>
对Bindy的调用设置如下:

from("sql:select * from performances?dataSource=afbl_source?outputType=SelectList&outputClass=com.myapp.MyDatabaseModel")
// Camel 2.15 or older (configure by package name)
BindyCsvDataFormat bindy = new BindyCsvDataFormat("com.myapp");
// Camel 2.16 onwards (configure by class name)
BindyCsvDataFormat bindy = new BindyCsvDataFormat(com.myapp.MyDatabaseModel.class);

.marshal(bindy)
将所有这些放在一起,您可以将项目分解为两行camel和一个java对象来完成此任务。“下面是完整的骆驼”

我想我还应该提到,如果您不想过于担心csv订单的配置,您实际上可以跳过整个注释过程,只需执行以下操作:

marshal().csv();

我刚刚开始使用Camel,因此可能还有另一种方法,但我能够在不知道字段名称的情况下从表转储到CSV文件,包括:

CsvDataFormat csv = new CsvDataFormat();
csv.setQuoteMode("ALL");

from("sql:select * from MY_TEST_TABLE?dataSource=oracleDataSource&useIterator=false").marshal(csv).to("file:///tmp?fileName=MY_TEST_FILE.csv");
并添加依赖项

    <dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-csv</artifactId>
<version>version</version>

org.apache.camel
骆驼csv
版本

我刚刚开始使用Camel,所以也许还有另一种方法,但我可以在不知道字段名的情况下将表转储到CSV文件,方法是:

CsvDataFormat csv = new CsvDataFormat();
csv.setQuoteMode("ALL");

from("sql:select * from MY_TEST_TABLE?dataSource=oracleDataSource&useIterator=false").marshal(csv).to("file:///tmp?fileName=MY_TEST_FILE.csv");
并添加依赖项

    <dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-csv</artifactId>
<version>version</version>

org.apache.camel
骆驼csv
版本

你的问题是什么?@Claus我如何使用索引而不是名称字段?如果不可能,我可以转换成csv吗?你的问题是什么?@Claus我如何使用索引而不是名称字段?如果不可能,我可以转换成csv吗?谢谢你的回复!问题是我不知道字段名。无论sql结果如何,我都必须将列表转换为csv格式。您可以利用数据库本身的功能。大多数数据库允许您将表导出为CSV。您可以将该特性作为存储过程加以利用,并对其进行调度,这样就不会有太多代码需要维护,从而进一步简化此过程。这也是你回复的另一个选择!问题是我不知道字段名。无论sql结果如何,我都必须将列表转换为csv格式。您可以利用数据库本身的功能。大多数数据库允许您将表导出为CSV。您可以将该特性作为存储过程加以利用,并对其进行调度,这样就不会有太多代码需要维护,从而进一步简化此过程。这也是另一种选择