sed怎么去掉csv文件里数值中间的逗号

基本概况

最近处理的数据文件中有一批数据是用csv格式保存的,且其中一个数据文件将近1G。csv格式的文件内容各列由逗号分隔,所以如果想要将这批数据导入到数据库需要将列分隔符换成导入命令中的列分隔符。另外,该数据文件的数值类型的列超过999时,使用了中间带逗号的形式进行存储。

数据类似如下:

    

问题分析

(1)怎样将csv的这批数据导入到数据库中?是否可以将导入命令的列分隔符直接换成逗号?想了想,行不通。因为这样会将超过999的数值类型的列里的逗号也当成列分隔符了,该数值列起码会被分成两列数据导入到数据库,会造成有这些数值列的数据导入失败。

(2)那么怎样才能不把数值类型列中的逗号当作列分隔符来进行导入?这样的话,可以将该列对应表的字段设置成字符串,再导入后再对该列字符串进行处理,所以是可行的。

(3)是否可以先将数值列中的逗号除去,然后再进行导入呢?先将列中的逗号去掉,这样列里的数字就是不带逗号的形式,也方便直接导入到对应表的字段是数值类型的表中而无需另外处理。

解决问题

按照分析的思路,有两种解决方式。

第一种,仅替换掉逗号分隔符,先把数据导入到数据库,再在数据库中对数据进行处理。

cat test_data.csv|sed 's/,,/"","",""/g'|sed 's/\([^0-9]\),/\1\|!/g'

代码解释:

 sed 's/,,/"","",""/g':将两个连续的逗号替换成"","",""的形式,避免下个sed里连续两个逗号不会被替换。

:将一个非数字和逗号替换成该字符和|!。()里的内容放到保留空间中,并使用\1还原出来。 

其中()为保留空间,保留空间一共有9个,可以当成变量来存储值,需要使用时分别使用1-9来表示。 

处理完成后的数据如下:

 第二种,替换掉数值列中的逗号,然后直接将数据导入数据库。

cat test_data.csv|sed ':start;s/\([0-9]\{1,\}\),\([0-9]\{3\}\)/\1\2/g;t start' |sed 's/,/\|!/g'

代码解释:

分别使用了两个()将两个数字放入保留空间中,在替换的时候将逗号前后两个数字还原,而数字被替换掉。这样做的目的是匹配起码1个数字加逗号加3个数字的列,并将其中的逗号替换为空。另外,由于数值较大时,数值中可能有多个逗号,所以加上跳转指令替换数值中所有的逗号。

 处理完成后的数据如下:

以上两种方式我都是使用的输出到屏幕的方式,如果直接修改数据文件,sed需要加上-i选项。

 建议使用第二种方式,因为可以直接替换掉不要的逗号,而且不用另外在数据库处理数据。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值