0
点赞
收藏
分享

微信扫一扫

kettle庖丁解牛第31篇之CSV文件字段过长

引言

在上一篇文章中,我们主要讲解的是:我工作中遇到的一个实际案例,数据源是一份Excel文件,在使用kettle抽取excel到sql server数据库后,发现数据的精度有问题、还伴随导入了大量的NULL记录行。

在本篇文章中,介绍的是:依然我工作中遇到的一个实际案例,数据源是一份csv文件,在使用kettle抽取csv到sql server数据库后,发现原始的数据的长度和目标表定义的列长度有问题。下面我们进入主题,展开来说一说吧。

原始数据文件

问题产生在 Part1列,由于页面宽度有限,我只能截图这么多,像第20行中,Part1列后面还有很长的数据。

kettle庖丁解牛第31篇之CSV文件字段过长_sqlserver

Sql Server中目标表定义

后续会把CSV的数据,导入到当前这个表,sqlserver中此表Part1的列宽是255,详细定义如下图。

kettle庖丁解牛第31篇之CSV文件字段过长_csv_02

实战演示

转换整体实现的其实并不复杂,只用到了2个组件:CSV文件输入、表输出。但是组件内部的设置,还是要注意看的,兄弟们。

a、整体实现

kettle庖丁解牛第31篇之CSV文件字段过长_csv_03

b、CSV文件输入设置

kettle庖丁解牛第31篇之CSV文件字段过长_sqlserver_04

把所有CSV文件识别的列,类型全改成String类型,防止在CSV输入时,因为类型识别出错。

仔细看标红的部分,Part1这个字段,被识别出来的宽度是384。为什么要提一下这个宽度,因为上面我们在Sql Server数据库中建表的时候,通过字符串类型的列宽默认给255个宽度。记住了这有一个坑了

c、预览CSV数据

kettle庖丁解牛第31篇之CSV文件字段过长_csv_05

兄弟们,仔细看上图中红线框的部分,数据全是null,记住这又有一个坑了

d、表输出设置

表输出组件兄弟们非常熟悉了,此处只列出数据库字段标签设置

kettle庖丁解牛第31篇之CSV文件字段过长_csv_06


e、运行转换

kettle庖丁解牛第31篇之CSV文件字段过长_sqlserver_07

kettle庖丁解牛第31篇之CSV文件字段过长_sql_08

kettle庖丁解牛第31篇之CSV文件字段过长_精度_09

kettle庖丁解牛第31篇之CSV文件字段过长_sqlserver_10

f、运行报错解读

(1)、在往lipengfei库中的test_length表中,做insert操作时,Part1这列被截断了,可以看出来,就是因为目标表的列宽度不够引起的。

(2)、给出CSV文件中,过长的原始数据内容,就是这一行数据引起的错误。

(3)、能看出来有999条的CSV数据,可以被正常输出到表中。但是在表输出组件中,我们设置的是每1000条记录会进行一次commit操作,现在只有999条记录输出,事务不能commit操作,所以此时在sqlserver的表中看不到记录。

一定要详细的看报错的信息,这是我们排错的入手点,不要看到一堆英文就恶心了。出了问题,别怕兄弟们,有事咱解决就是了。

解决宽度问题

a、修改目标表列的宽度

修改表中列的宽度,在sqlserver中可以指定宽度为max,但是不要指定为max。要根据数据的实际宽度来设计,上面Kettle识别的CSV中此列最大宽度为384,别抠抠搜搜的,咱们局气点,所以此处我把表中的列宽度设置为400。

kettle庖丁解牛第31篇之CSV文件字段过长_sql_11

关闭后,不让修改表结构,提示如下。

kettle庖丁解牛第31篇之CSV文件字段过长_kettle_12

b、修改sqlserver设置

工具----->选项

kettle庖丁解牛第31篇之CSV文件字段过长_csv_13

kettle庖丁解牛第31篇之CSV文件字段过长_精度_14

c、再次修改目标表列的宽度

kettle庖丁解牛第31篇之CSV文件字段过长_sqlserver_15

d、验证操作结果

kettle庖丁解牛第31篇之CSV文件字段过长_sql_16

kettle庖丁解牛第31篇之CSV文件字段过长_sql_17

可以看到,目标表的列宽度,已经成功修改为400了。

再次运行转换

a、运行转换

kettle庖丁解牛第31篇之CSV文件字段过长_kettle_18

运行成功了,这次没有报错数据被截断。但是原始CSV文件中,也没有这么多数据啊。我们要排查一下,这是为什么啊??

b、查看原始CSV文件

kettle庖丁解牛第31篇之CSV文件字段过长_sqlserver_19

此处虽然显示是40行,但第1行是excel中的表头,所以真正入库的数据应该只有39行。

c、查看目标表中数据

kettle庖丁解牛第31篇之CSV文件字段过长_kettle_20

查看表中数据,前39行记录是正确的,从39行开始,后面全是大量的NULL记录。

解决NULL数据问题

其实现在问题就是:秃子头上的虱子---->明摆着,原始的CSV文件中有大量的空白行数据。

a、文本文件输入组件

突然想到CSV文件,可以使用 文本文件输入 读取的,指定好数据列的分割符为:,号即可,并且 文本文件输入中,有对 空行数据的控制。

kettle庖丁解牛第31篇之CSV文件字段过长_kettle_21

我们的CSV文件,各列是以,分割的,但是从原始文件中,可以看出来有的列中的数据包括了所以 文本文件输入还是处理不了。

b、Excel输入组件

Excel输入组件中,也有对空行数据的控制。所以,要把原数据CSV文件另存为Excel文件。转换也要进行修改,把CSV文件输入换成Excel输入

kettle庖丁解牛第31篇之CSV文件字段过长_kettle_22

Excel文件组件大家非常熟悉了,此处我直接进行主题,我们看一下内容标签的设置:非空白记录 选项,选中此项目,这样就把上面NULL的记录全过滤掉了。

kettle庖丁解牛第31篇之CSV文件字段过长_sqlserver_23

c、预览Excel数据

预览记录一下,并没有整行都为NULL行记录,如下图所示。

kettle庖丁解牛第31篇之CSV文件字段过长_sqlserver_24

d、把目标表数据清空

kettle庖丁解牛第31篇之CSV文件字段过长_精度_25

再次运行转换

a、运行转换

kettle庖丁解牛第31篇之CSV文件字段过长_sqlserver_26

从转换运行的提示可以看出来,本次操作的记录数为39行。我们还是要再去查询表中的记录,看看是不是同样正常。

b、查看目标表中数据

kettle庖丁解牛第31篇之CSV文件字段过长_kettle_27

可以看出目标表中的数据,也全是正常的,所有问题全没有了。

c、总结

日后再给我们数据,我们就要excel格式。不要CSV或者txt的,处理起来太麻烦。此处是因为我们的数据量小,我直接另存为excel格式了。如果数据行数过多,这种格式另存为就有问题,会导致数据丢失。目前excel最大的记录行数为:1048576。如果给的CSV文件实际为200W行,如果你另存为excel格式,在excel中只保存为:1048576行

举出几个CSV文件问题点

a、分割符问题

CSV文件中,每列之前使用,分割,如果数据列中就是包含, 这就麻烦了

b、科学记数法

CSV文件中,如果列中的数据以 科学记数法 保存,处理起来也比较麻烦,直接灌入到表中也可能是科学记数法。

c、格式丢失

CSV文件中的数据,也容易格式丢失,附上百度截图

kettle庖丁解牛第31篇之CSV文件字段过长_csv_28

结束语

在本篇文章中,介绍的是:我工作中遇到的一个实际案例,数据源是一份csv文件,在使用kettle抽取csv到sql server数据库后,发现原始的数据的长度和目标表定义的列长度有问题。

估计不少兄弟,一开始看这篇文章标题时,应该感觉应该挺简单的,随着文章的仔细阅读后,发现简单其实真不简单!!!

兄弟们,其实想和作是有一段距离的,你想着想着就没有了,可是你做着做着,它就落地了。

啥都别说了,兄弟们后面跟着我干就完了,我们依然掰开揉碎的方式去说。后续的内容更精彩,敬请期待,感谢兄弟们的关注!!!


举报

相关推荐

0 条评论