4 回答
TA贡献1803条经验 获得超3个赞
要快速提取特定键的值,我个人喜欢使用“grep -o”,它只返回正则表达式的匹配。例如,要从推文中获取“文本”字段,请执行以下操作:
grep -Po '"text":.*?[^\\]",' tweets.json
这个正则表达式比你想象的更强大; 例如,它可以很好地处理嵌入了逗号并在其中包含转义引号的字符串。我认为通过更多的工作,你可以制作一个实际上可以保证提取值,如果它是原子的。(如果它有嵌套,那么正则表达式当然不能这样做。)
为了进一步清洁(虽然保持弦的原始逃逸),你可以使用类似的东西:| perl -pe 's/"text"://; s/^"//; s/",$//'
。(我为此分析做了这个。)
对于所有坚持你的仇敌应该使用真正的JSON解析器 - 是的,这对正确性至关重要,但是
要做一个非常快速的分析,比如计算值以检查数据清理错误或获得对数据的一般感觉,在命令行上敲打一些东西会更快。打开编辑器编写脚本会分散注意力。
grep -o
比Python标准json
库快几个数量级,至少在为推文(每个约2 KB)执行此操作时。我不确定这是不是因为json
速度慢(我应该在某个时候与yajl比较); 但原则上,正则表达式应该更快,因为它是有限状态并且更加可优化,而不是必须支持递归的解析器,并且在这种情况下,为您不关心的结构花费大量CPU构建树。(如果有人写了一个有限状态传感器,它做了适当的(深度限制的)JSON解析,那就太棒了!同时我们有“grep -o”。)
要编写可维护的代码,我总是使用真正的解析库。我没有尝试过jsawk,但是如果它运行良好,那将解决点#1。
最后一个更糟糕的解决方案:我编写了一个脚本,它使用Python json
并将所需的键提取到以制表符分隔的列中; 然后我通过一个包装器管道awk
,允许对列进行命名访问。 在这里:json2tsv和tsvawk脚本。所以对于这个例子,它将是:
json2tsv id text < tweets.json | tsvawk '{print "tweet " $id " is: " $text}'
这种方法没有解决#2问题,比单个Python脚本效率更低,而且有点脆弱:它强制对字符串值中的换行符和制表符进行规范化,以便与awk的字段/记录分隔的世界视图一起使用。但它确实让你留在命令行,更正确grep -o
。
添加回答
举报