Flat类型文件是一种包含没有相对关系结构的记录的文件。在批处理应用中经常需要处理的文件是简单文本格式文件,这类文件通常没有复杂的关系结构,通常经过分隔符分割,或者定长字段来描述数据格式;稍复杂的文件通过JSON的方式定义数据格式。

Spring Batch框架提供的ItemReader本质上是从Flat文件中读取记录,并将记录转换为Java中的对象。Flat文件格式有如下几种不同的类型:

springbatch 读处理 写流程和原理 springbatch读定长文件_batch

 

一、分隔符类型文件

        分隔符类型文件通常是根据设定的分隔符来区分一条记录中的不同字段,如下是以“,”为分隔符的文件,第一段表示信用卡号、第二段表示用户名、第三段表示消费金额、第四段表示消费日期、第五段表示消费地点:


4047390012345678,tom,100.00,2013-2-2 12:00:08,Lu Jia Zui road
4047390012345678,tom,320.00,2013-2-3 10:35:21,Lu Jia Zui road
4047390012345678,tom,674.70,2013-2-6 16:26:49,South Linyi road
4047390012345678,tom,793.20,2013-2-9 15:15:37,Longyang road
4047390012345678,tom,360.00,2013-2-11 11:12:38,Longyang road
4047390012345678,tom,893.00,2013-2-28 20:34:19,Hunan road


二、定长类型文件

        定长类型文件中没有任何分隔符,但是每个字段的长度是确定的。如下就是定长类型文件,前16个字符表示信用卡卡号,接下来12个字符表示用户名,接下来8个字符表示消费金额,接下来19个字符表示消费日期,最后16个字符表示消费地点:


4041390012345678tom       00100.002013-02-02 12:00:08    Lu Jia Zui road
4042390012345678tom       00320.002013-02-03 10:35:21    Lu Jia Zui road
4043390012345678jerry     00674.702013-02-06 16:26:49   South Linyi road
4044390012345678rose      00793.202013-02-09 15:15:37      Longyang road
4045390012345678bruce     00360.002013-02-11 11:12:38      Longyang road
4046390012345678rachle    00893.002013-02-28 20:34:19         Hunan road

三、JSON格式文件

        JSON(JavaScript Object Notation)是一种轻量级的数据交换个事。它是基于JavaScript的一个子集。

JSON有两种结构:对象和数组:

(1)对象:对象在js中表示为“{ }”扩起来的内容,数据结构为{key:value,key:value,......}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,取值方法为对象.key获取属性值,这个属性值的类型可以是数字、字符串、数组和对象。

(2)数组:数组在js中是用中括号“[ ]”扩起来的内容,数据结构为[ "java","javascript","vb",......],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是数字、字符串、数组和对象。

通过这两种结构可以表示各种复杂的结构,如下:


{ "accountID": "4047390012345678",
"name": "tom",
"amount": 100.00,
"date": "2013-2-2 12:00:08",
"address": "Lu Jia Zui road"}
{ "accountID": "4047390012345678",
"name": "tom",
"amount": 320.00,
"date": "2013-2-3 10:35",
"address": "Lu Jia Zui road"}
{ "accountID": "4047390012345678",
"name": "tom",
"amount": 674.70,
"date": "2013-2-6 16:26:49",
"address": "South Linyi road"}
{ "accountID": "4047390012345678",
"name": "tom",
"amount": 793.20,
"date": "2013-2-9 15:15:37",
"address": "Longyang road"}
{ "accountID": "4047390012345678",
"name": "tom",
"amount": 360.00,
"date": "2013-2-11 11:12:38",
"address": "Longyang road"}
{ "accountID": "4047390012345678",
"name": "tom",
"amount": 893.00,
"date": "2013-2-28 20:34:19",
"address": "Hunan road"}


四、分隔符类型文件之记录跨多行格式

        通常情况下一条记录占用一行,在某些特殊情况下可能出现一条记录占用多行的场景,下面展示了一条记录占用两行的情景。第一行描述了信用卡编号、姓名、消费金额、消费时间,第二行是消费地址:


4047390012345678,tom,100.00,2013-2-2 12:00:08
,Lu Jia Zui road
4047390012345678,tom,320.00,2013-2-3 10:35:21
,Lu Jia Zui road
4047390012345678,tom,674.70,2013-2-6 16:26:49
,South Linyi road
4047390012345678,tom,793.20,2013-2-9 15:15:37
,Longyang road
4047390012345678,tom,360.00,2013-2-11 11:12:38
,Longyang road
4047390012345678,tom,893.00,2013-2-28 20:34:19
,Hunan road

五、分隔符类型文件之交替记录

        另外一种更复杂的文件格式是在同一个文件中有两种或者更多类型的记录类型,不同的记录类型通过不同的前缀方式表示,下面展示了一个文件中两种不同类型的记录,其中40开头的为信用卡消费记录,以30开头的为借记卡消费记录情况:


4047390012345678,tom,100.00,2013-2-2 12:00:08,Lu Jia Zui road
3047390012345671,249.10,rose,2013/4/1 11:34:56
4047390012345678,tom,320.00,2013-2-3 10:35:21,Lu Jia Zui road
3047390012345671,249.10,rose,2013/4/1 11:34:56
4047390012345678,tom,674.70,2013-2-6 16:26:49,South Linyi road
3047390012345673,840.20,marry,2013/4/3 3:21:43
4047390012345678,tom,793.20,2013-2-9 15:15:37,Longyang road
4047390012345678,tom,360.00,2013-2-11 11:12:38,Longyang road
4047390012345678,tom,893.00,2013-2-28 20:34:19,Hunan road


六、带有头和注释的分隔符文件

        此类文件中增加了注释行,注释以“##”或者“$$”开头,同时在头部有文件的结构性说明:


accountID,name,amount,date,address
## this line is first comment
4047390012345678,tom,100.00,2013-2-2 12:00:08,Lu Jia Zui road
## maybe address is not right
4047390012345678,tom,320.00,2013-2-3 10:35:21,Lu Jia Zui road
$$ this line is comment, begin with &&
4047390012345678,tom,674.70,2013-2-6 16:26:49,South Linyi road
4047390012345678,tom,793.20,2013-2-9 15:15:37,Longyang road
4047390012345678,tom,360.00,2013-2-11 11:12:38,Longyang road
## maybe time is not right