现象
db2
中对数据库进行import 导入数据操作
操作日志显示部分导入错误,错误:
SQL3148W A row from the input file was not
inserted into the table.
Some
data following ""0292|TMNO=ttyx5|CUNO=10205968" in row "334392"
and
column "6" was not loaded.
SQL3116W The field value in row "584959" and
column "1" is missing, but the
target
column is not nullable.
等
原因
数据文件中部分字符型字段的数据中存在回车和双引号导致DB2
IMPORT命令在执行导入操作时错误的读取了源数据,数据文件中存在空行。
分析
通过错误提示中的行号和列号查找源数据文件中的错误数据发现错误出数据
说明:
源数据中以逗号为字段分隔符,字符型字段数据前后已双引号括起来,每一行代表一条记录,如果字符型数据中的字符串包含双引号将被误认为字符串结束引号之后的为下个字段;如果字符型数据中的字符串包含回车,会导致该条记录被误认为两条记录,第二行将作为新的一条记录导入,从而导入第二行的数据与数据表结构不匹配;数据文件中两行数据之间如果存在空行导致数据库命令认为多出一行空记录与数据表结构不一致无法导入从而产生错误日志。
解决方法
1.获取源数据时去除多余引号和回车。
2.通过SHELL脚本中SED命令和TR命令替换到回车、空行、引号,命令如下:
sed -e '/^$/d' 用于去除数据文件中的多余空行
sed -e 's/^"/`/' -e 's/"$/`/' -e 's/,"/,`/g'
-e 's/",/`,/g' -e 's/"/#/g' -e 's/`/"/g' 用于替换字符型字段的字符串中的多余引号
sed -e
's/\"$/\"@/' | tr '\n' ' ' | tr '@' '\n' 用于替换字符型字段的字符串中的多余回车