免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 30706 | 回复: 30
打印 上一主题 下一主题

请教:csv文件中的双引号和逗号处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-27 20:04 |只看该作者 |倒序浏览
万能的cu shell版,给我个答案吧:
我有一个csv的文件要处理,格式如下吧:
1,"2009/01/05","name1","           6,301","    13,459,138"
2,"2009/02/05","name2","           6,302","    23,459,138"
最终要处理成:
1,2009/01/05,name1,6301,13459138
2,2009/02/05,name2,6302,23459138

也就是:
(1)如果双引号中有逗号,去掉逗号
(2)去掉所有的双引号,最终只使用逗号分隔

有时候第二列、第三列没有双引号的,有时候有
而第四列则是,如果中间有逗号,则有双引号,没有逗号,则没有双引号

我理解的csv格式是:
(1)列之间使用逗号分隔
(2)如果单列里的内容有逗号,则用双引号括起该列,以区别列分隔符的逗号

如何处理这种csv格式?请教各位大侠

论坛徽章:
0
2 [报告]
发表于 2009-02-27 20:10 |只看该作者
cat urfile | tr -d "\"\t "

  1. [rockfall@tmp]$cat b
  2. 1,"2009/01/05","name1","           6,301","    13,459,138"
  3. 2,"2009/02/05","name2","           6,302","    23,459,138"
  4. [rockfall@tmp]$cat b |tr -d "\"\t "
  5. 1,2009/01/05,name1,6,301,13,459,138
  6. 2,2009/02/05,name2,6,302,23,459,138
  7. [rockfall@tmp]$

复制代码

论坛徽章:
0
3 [报告]
发表于 2009-02-27 20:13 |只看该作者

回复 #2 haimming 的帖子

。。。。。。。。。。。。。。。。。。。
双引号是去掉了,列分隔符也乱掉了

论坛徽章:
0
4 [报告]
发表于 2009-02-27 20:18 |只看该作者
忘记说了 其实我文件里实际的name是日文字符:フコリウ  之类的。
所以 sed 's/\(\"\)(a-zA-Z1-9,)*\(\"\)/\2/g' 之类的匹配双引号中间的字符是不行的

[ 本帖最后由 voipexplore 于 2009-2-27 20:21 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-02-27 20:32 |只看该作者

回复 #3 voipexplore 的帖子

不好意,没认真看,现在只想到了个很恶心的
sed -r 's/"([^",]*)"/\1/g;s/" *([^,]*),([^,]*)*"/\1\2/;s/" *([^,]*),([^,]*),([^,]*)"/\1\2\3/' urfile
如果格式只是这样可能没问题

论坛徽章:
0
6 [报告]
发表于 2009-02-27 21:06 |只看该作者
这个问题比较有意思,我只会这种笨办法
sed -r 's/"([^"]+),([^"]+),([^"]*)"/\1\2\3/g;s/"([^"]+),([^"]*)"/\1\2/g;s/"([^"]*)"/\1/g;s/\s+//g'
不知道有没有更好的解决办法

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
7 [报告]
发表于 2009-02-27 21:12 |只看该作者

回复 #1 voipexplore 的帖子

sed -r ':a;s/("[^"]+),([^"]+")/\1\2/g;ta;s/[" \t]//g' urfile

论坛徽章:
0
8 [报告]
发表于 2009-02-27 21:16 |只看该作者
sed 's/,//g;s/\s//g;s/\"\+/,/g;s/.$//' urfile
这个没那么恶心了

  1. [rockfall@tmp]$sed 's/,//g;s/\s//g;s/\"\+/,/g;s/.$//' urfile
  2. 1,2009/01/05,name1,6301,13459138
  3. 2,2009/02/05,name2,6302,23459138

复制代码

论坛徽章:
0
9 [报告]
发表于 2009-02-27 21:18 |只看该作者
@ly5066113

谢谢 完全正确啊 多谢

也谢谢haimming  justlooks,不过有结果不对,可能是中间有日文的原因吧,结果没再深究。

论坛徽章:
0
10 [报告]
发表于 2009-02-27 21:20 |只看该作者
@haimming
多谢 你最后的也是正确的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP