如何将列别名添加到输出 csv 文件 spring 批处理

How to add column alias names to output csv file spring batch

我需要在生成 CSV 文件时添加 SQL 查询中定义的别名。

我看到一些使用 FlatFileHeaderCallback 的例子,但我没有办法传递别名

有什么方法可以在 FlatFileItemWriter

write(List<? extends T> items) 方法中获取列别名

对于初学者,我认为您可以简单地使用一个自定义的 FlatFileHeaderCallback,它将一个字符串作为参数并将其写入:

public class CustomHeaderWriter implements FlatFileHeaderCallback {

    private String header;

    @Override
    public void writeHeader(Writer writer) throws IOException {
        writer.write(header);
    }

    public void setHeader(String header) {
        this.header = header;
    }
}

要使用它,请在您的 FlatFileItemWriter 中声明它并给它一个字符串,其中包含您的 columns/aliases 的名称,由您的平面文件定界符分隔:

<bean class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
   <property name="headerCallback">
       <bean class="xx.xx.xx.CustomHeaderWriter">
           <property name="header" value="${columns.or.aliases}"></property>
        </bean>
   </property>
</bean>

现在,我想你不想为 header 写第二次 columns/aliases,而想从 SQL 中写 "extract"询问。这可以通过摆弄 CustomHeaderWriter :

来实现
  • 不是直接传递 columns/aliases,而是给它实际的 SQL 查询
  • 使用正则表达式或手动解析,然后您可以提取别名或列名(SELECTFROM 之间的字符串、用 , 拆分、去掉引号等.)
  • 然后您需要传递(或使用常量)FlatFileItemWriter
  • 的分隔符
  • 最后,写入刚刚构建的字符串

创建自定义 class(假设有 5 个 csv 列):

public class MyFlatFileWriter implements FlatFileHeaderCallback {

 @Override
 public void writeHeader(Writer writer) throws IOException {
    writer.write("Col1,Col2,Col3,Col4,Col5");
}
}

在 writer bean 中添加 bean 及其引用:

    <bean id="flatFileWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
      <property name="resource" value="file:csv/outputs/name.csv" />
      <property name="headerCallback" ref="headerCallback" />
      <property name="lineAggregator">
       ............
      </property>
    </bean>

<bean id="headerCallback" class="com.whatever.model.MyFlatFileWriter" />