【问题标题】:records for multiple output db tables in single input file单个输入文件中多个输出数据库表的记录
【发布时间】:2012-01-10 06:41:04
【问题描述】:

我正在获取一个文件,其中包含具有不同列数的多个输出表的数据。

第一列将决定记录应该放在哪个表。

head1|abc|123|sklj|sad
head2|klj|lkj|323|323
tab1|one|two|three|four|five
tab2|one|two|three
tab2|one|two|three
tab3|one|two|three|four

如上图,head指定了header。所以前两行是标题记录。

tab1 指定表 1。它有五列。所以所有以 tab1 开头的记录都应该加载到 table1 中。

tab2 指定表 2。它有三列。所以所有以tab2开头的记录都应该加载到table2中。

tab3 指定表 3。它有四列。所以所有以 tab3 开头的记录都应该加载到 table3 中。

如何实现这个场景?

是否有任何适用于相同场景的示例?

感谢阅读!

【问题讨论】:

  • 这与 Spring 有什么关系?只需将其拆分并映射到所需的表。

标签: spring spring-batch


【解决方案1】:

一个简单的弹簧批处理解决方案可能是:

  • 具有抽象父类“targetTab”和每个目标表的特定类的域模型,例如TargetTab1 扩展 TargetTab
  • 将行读取为列表/地图的阅读器
  • (映射选项 1)自定义 FieldSetMapper 实现,它决定列表/映射中第一个条目的目标表并创建特定的 targetTab 对象,例如targetTab1
  • (映射选项2)处理器的作用与上面的FieldSetMapper相同
  • writer 接受 TargetTab 类型的所有对象
  • 同一个作者检查类型并决定应该使用哪个真正的作者(简单的 dao 实现)

一个更具扩展性的解决方案可能会引入一个预批处理/脚本,它根据目标表将文件拆分为 3 个(或更多)文件,并为每种类型分配一个不同的批处理

【讨论】:

  • 感谢迈克尔的投入! PatternMatchingCompositeLineTokenizer 在这种情况下不会有任何帮助吗?如果没有,那么将通过使用预批处理脚本方法分割文件..看起来更简单!
  • 对于您的示例行格式,PatternMatchingCompositeLineTokenizer 似乎有点过头了,一个简单的 DelimitedLineTokenizer(带分隔符:|)和 PassThroughFieldSetMapper 就足够了,如果你坚持我会提出一个特定的 FieldSetMapper 实现,它的作用与我的答案中的处理器(根据行内容决定映射目标),但同样不需要 PatternMatching
  • 谢谢迈克尔!您能否看看我关于在文件开头添加列名的问题!我将七列作为输出发送到文件。我也想包含列名!
猜你喜欢
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多