alibaba / DataX

DataX是阿里云DataWorks数据集成的开源版本。
Other
15.73k stars 5.39k forks source link

关于读取文件对null值和空串的处理 #2094

Open maoyu123xue opened 5 months ago

maoyu123xue commented 5 months ago

datax在读取文件内容时,由InputStream到BufferReader到javacsv提供CsvReader,转换成CsvReader时,两分隔符之间的空值都被识别为空串,比如“1”,,"" 想被识别为“1”,null,"" ,但实际是识别为“1”,“”,“” 配置nullformat不能满足要求,因为这里是需要区分空值和空串,我这边的做法是将javacsv替换成opencsv,使用opencsv的CSVReader,该类提供了区分null和空串的方法,也能识别两引号之间的分隔符,但是无法评估其他可能的影响,这里想请教一下使用javacsv的理由是什么,有没有不可替代性,查看中央仓库发现javacsv是2008年的包,只有一个版本且后面从未更新过,是否可以替换为opencsv,这里贴出修改的地方 image image image image

maoyu123xue commented 4 months ago

研究源码后发现可以不换依赖,可以自定义CsvReader实现读取文件区分空值和空串,获取字段内容是计算下标的差值,下标到换行符等,如果没找到字段内容默认为“”,在CsvReader类大约900行的endColumn方法中,因此这边加了个处理,原本字段默认值为“”,只处理下标差值大于0的情况,现在字段默认值为null,下标小于0时为空串,这么修改后可以区分空值和空串了,然后要去修改工具类,因为columnValue可以为null了,所以nullFormat处的判断要改,原本是columnValue.equals(nullFormat),columnValue为空会报脏数据异常,现在改为StringUtils.isNotEmpty(columnValue)&&columnValue.equals(nullFormat),当不为空才去判断是否为空值格式化