java - Apache Camel - SQL 到 CSV

标签 java xml csv apache-camel blueprint-osgi

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

<route id="extractfromafbl">
  <from uri="timer:foo?period=10000"/>
  <to uri="sql:select * from performances?dataSource=afbl_source"/>
  <to uri="bean:ngtrend.afbl2afc.transformer?method=tocsv(Exchange)"/>
  <log message="${body}"/>
</route>

这是创建 csv 格式的转换器类:

    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");
                 }
            }
        }

在这种情况下,我应该知道字段的名称(例如 id、lastname ...)并且我想使用索引 相反,因为表或字段可以更改。

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

最佳答案

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

from("sql:select * from performances?dataSource=afbl_source?outputType=SelectList&outputClass=com.myapp.MyDatabaseModel")

完成此设置后,您将在您的 Camel 体内获得一个对象

List<MyDatabaseModel>

此时,您可以利用名为 Bindy 的驼峰组件。它会让你有一个代表 CSV 文件的对象。绑定(bind)它的方式是在数据库模型上添加一些注释,这样它也可以代表您的 csv 输出。

@CsvRecord(isOrdered = true)
public Class MyDatabaseModel{

   @DataField(pos = 1, position = 11)
   private int orderNr;

   @DataField(pos = 2, position = 10)
   private String clientNr;

   ...
}

对 Bindy 的调用将设置如下:

// 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)

将它们放在一起,您可以将项目分解为 2 行 Camel 和 1 个 Java 对象来完成此任务。 “下面是完整的 Camel ”

from("sql:select * from performances?dataSource=afbl_source?outputType=SelectList&outputClass=com.myapp.MyDatabaseModel")
    .marshal(bindy);

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

marshal().csv();

关于java - Apache Camel - SQL 到 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37654466/

相关文章:

c++ - 将 C++ 文件解析为 XML 文件

java - Java 中散列 xml 字符串的最佳散列函数

php - 当 2 个或多个字段具有相同名称时,使用 PHP 从 XML 提要中获取数据

xml - 在 Powershell 中将 xml 转换为 csv 文件

python - 使用 Python 将 2 个独立的 .csv 文件放在一张图表上

java - 如何避免 switch 语句?

java - 如何在 MainActivity 中同时使用 AppBaseActivity 和 ActionBarActivity

python - Pandas 无法读取 csv 文件,它将全部替换为 NaN

java - 使用 GenericDAO 插入第二个数据源时出错

java - 分页时 CellTable 高度缩小