免费注册 查看新帖 |

Chinaunix

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

[文本处理] 文本转json [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-04-06 22:50 |只看该作者 |倒序浏览
有下面的一个文件:

=== WriteRows ===
Column: id, Value: 10
Column: name, Value: aa
Column: sc, Value: 100
=== UpdateRows ===
Column: id, Value: 10 => 20
Column: name, Value: aa => aa
Column: sc, Value: 100 => 100
=== WriteRows ===
Column: id, Value: 10
Column: name, Value: aa
Column: sc, Value: 100
=== DeleteRows ===
--
Column: id, Value: 20
Column: name, Value: aa
Column: sc, Value: 100
--
Column: id, Value: 20
Column: name, Value: aa
Column: sc, Value: 100


要把上面的文件转化为json 类型

{"type":"WriteRows","id":"10","name":"aa","sc":"100"}
{"type":"UpdateRows","old_id":"10","old_name":"aa","old_sc":"100","id":"20","old_name":"aa","old_sc":"100"}
{"type":"DeleteRows","id":"20","name":"aa","sc":"100"}
{"type":"DeleteRows","id":"20","name":"aa","sc":"100"}


求教

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [报告]
发表于 2016-04-07 10:34 |只看该作者
回复 1# crasshopper

modify by yourself

$ awk -vq='"' 'function iv(i,v){return(q i q":"q v q)}/^===/{gsub(/^[= ]+|[= ]+$/,"");t=iv("type",$0);c=0;Out=Out N "{" t;N="}\n";next}/^--/{if(c++)Out=Out N "{" t;next}{if(match($0,"Column: ([^,]+), Value: ([^ ]+)( => ([^ ]+))?",a)){if(a[3])Out=Out","iv("old_"a[1],a[2]);Out=Out","iv(a[1],a[2])}}END{print Out"}"}' FILE
{"type":"WriteRows","id":"10","name":"aa","sc":"100"}
{"type":"UpdateRows","old_id":"10","id":"10","old_name":"aa","name":"aa","old_sc":"100","sc":"100"}
{"type":"WriteRows","id":"10","name":"aa","sc":"100"}
{"type":"DeleteRows","id":"20","name":"aa","sc":"100"}
{"type":"DeleteRows","id":"20","name":"aa","sc":"100"}

   

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
3 [报告]
发表于 2016-04-07 15:27 |只看该作者
本帖最后由 sunzhiguolu 于 2016-04-07 15:29 编辑

  1. #!usr/bin/perl
  2. use strict;
  3. use warnings;

  4. sub to_jason{
  5.     my ($sT, $ra) = (@_);
  6.     if ($sT eq "WriteRows"){
  7.         printf ('{"type":"%s","%s":"%s","%s":"%s","%s":"%s"}%s',$sT,@$ra,"\n");
  8.     }elsif ($sT eq "UpdateRows"){
  9.         printf ('{"type":"%s","old_%s":"%s","old_%s":"%s","old_%s":"%s","%s":"%s","old_%s":"%s","old_%s":"%s"}%s',$sT,$ra->[0],$ra->[1],$ra->[3],$ra->[4],$ra->[6],$ra->[-1],$ra->[0],$ra->[2],$ra->[3],$ra->[4],$ra->[6],$ra->[7],"\n");
  10.     }else{
  11.         my @aCopy = @$ra;
  12.         while (@aCopy){
  13.             printf ('{"type":"%s","%s":"%s","%s":"%s","%s":"%s"}%s',$sT,splice (@aCopy,0,6),"\n");
  14.         }
  15.     }
  16. }

  17. my ($sPrint, @aData, $sType);
  18. my $sPreType = $1 if (<> =~ /(\w+)/);
  19. while (<>){
  20.     if (/\A=\W+(\w+)/){
  21.         ($sPrint, $sType) = (1, $1);
  22.     }else{
  23.         push (@aData, $_) foreach (m/(?:(?<=: )|(?<==> ))\w+/g);
  24.     }
  25.     if ($sPrint || eof){
  26.         to_jason ($sPreType, \@aData);
  27.         ($sPrint, $sPreType, @aData) = (0, $sType, ());
  28.     }
  29. }

复制代码
perl toJason.pl data
  1. {"type":"WriteRows","id":"10","name":"aa","sc":"100"}
  2. {"type":"UpdateRows","old_id":"10","old_name":"aa","old_sc":"100","id":"20","old_name":"aa","old_sc":"100"}
  3. {"type":"WriteRows","id":"10","name":"aa","sc":"100"}
  4. {"type":"DeleteRows","id":"20","name":"aa","sc":"100"}
  5. {"type":"DeleteRows","id":"20","name":"aa","sc":"100"}
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
4 [报告]
发表于 2016-04-07 17:04 |只看该作者
回复 2# jason680
大神好, 能否将您的 awk => perl 代码, awk 好多地方看不懂, 希望学习下. 还有我的 perl 代码好像格式化字符串部分很乱. 您那个感觉非常简洁.
能否学习下, 谢谢...

   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
5 [报告]
发表于 2016-04-07 19:01 |只看该作者
回复 4# sunzhiguolu

>> ... awk 好多地方看不懂

那里不懂....
你这样问,我也不懂......
   

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
6 [报告]
发表于 2016-04-07 19:05 |只看该作者
回复 5# jason680
就是在处理最后的输出的时候, 格式化字符串用 perl 怎么弄, 我的那个看着乱糟糟的.

   

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
7 [报告]
发表于 2016-04-07 22:18 |只看该作者
本帖最后由 sunzhiguolu 于 2016-04-07 22:20 编辑

回复 5# jason680
向您学习了, function iv 非常棒. 我格式化后的字符串现在一片乱糟糟.
  1. sub Wrap{
  2.     my ($s1, $s2) = (@_);
  3.     sprintf ('"%s":"%s"',$s1,$s2);
  4. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2018-01-19 16:09 |只看该作者
回复 2# jason680 你好大神,我在Ubuntu运行是成功的,但是在openwrt的busybox中运行,会出现{"type":"settings","":"","":"","":"","":"","":""},好像是match部分没有起到作用,请问如何解决比较好,谢谢了

论坛徽章:
0
9 [报告]
发表于 2018-01-19 16:40 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
10 [报告]
发表于 2018-01-19 16:47 |只看该作者
回复 9# 本友会机友会摄友会

可以说说你的解题方法和思路吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP