如何用Perl不依赖JSON模块实现KEGG嵌套JSON转TSV
KEGG KO层级JSON转TSV的Perl无依赖实现问题
现有实现方案
我需要将KEGG接口返回的JSON格式KO层级数据转换为4列TSV格式,数据源地址:https://rest.kegg.jp/get/br:ko00001/json
此前通过sed+awk实现的可正常运行的命令如下:
sed -E 's/^\t{2}"name"/\t\t"level 1"/g;s/^\t{3}"name"/\t\t\t"level 2"/g;s/^\t{4}"name"/\t\t\t\t"level 3"/g;s/^\t{5}"name"/\t\t\t\t\t"level 4"/g' json.json | awk 'BEGIN {OFS="\t"} NR > 4 {match($0, /"([^"]+)": *("[^"]*")/, a)} {tag = a[1]; val = gensub(/^"|"$/, "", "g", a[2]); f[tag] = val; if (tag == "level 4") {print f["level 1"], f["level 2"], f["level 3"], f["level 4"]}}' > table.tsv
该命令可将下载保存的json.json文件转换为符合要求的table.tsv文件。
当前Perl代码
我目前正在学习Perl用于后续项目开发,要求不引入JSON相关第三方模块实现同等转换效果,以此熟悉Perl语法和数据处理逻辑,当前编写的初步代码如下,存在逻辑错误无法得到正确结果:
use strict; my $brite_hierarchy_filepath = shift @ARGV; open my $brite_hierarchy, '<:utf8', $brite_hierarchy_filepath or die q{Can't open $brite_hierarchy_filepath: $!\n}; while (my $line = <$brite_hierarchy>) { next if $. == 4; chomp $line; $line =~ s/\A\t{2}"name"/"level_1"/; $line =~ s/\A\t{3}"name"/"level_2"/; $line =~ s/\A\t{4}"name"/"level_3"/; $line =~ s/\A\t{5}"name"/"level_4"/; my ($tag) = $line =~ /\A"(.*?)"/; my ($value) = $line =~ /\A"level_[1-4]":"(.*?)"/; my %field = ($tag => $value) unless $tag eq "" && $value eq ""; for (keys %field) { print join("\t", $field{"level_1"}, $field{"level_2"}, $field{"level_3"}, $field{"level_4"}, "\n"); }; last if eof $brite_hierarchy; };
数据结构与预期输出
待处理JSON为多层children嵌套结构,数据样例:
{ "name":"ko00001", "children":[ { "name":"09100 Metabolism", "children":[ { "name":"09101 Carbohydrate metabolism", "children":[ { "name":"00010 Glycolysis \/ Gluconeogenesis [PATH:ko00010]", "children":[ { "name":"K00844 HK; hexokinase [EC:2.7.1.1]" }, { "name":"K12407 GCK; glucokinase [EC:2.7.1.2]" }, { "name":"K00845 glk; glucokinase [EC:2.7.1.2]" }, ...
预期输出为4列TSV,每列对应1-4级层级的name字段值,输出样例:
09100 Metabolism 09101 Carbohydrate metabolism 00010 Glycolysis / Gluconeogenesis [PATH:ko00010] K00844 HK; hexokinase [EC:2.7.1.1] 09100 Metabolism 09101 Carbohydrate metabolism 00010 Glycolysis / Gluconeogenesis [PATH:ko00010] K12407 GCK; glucokinase [EC:2.7.1.2] 09100 Metabolism 09101 Carbohydrate metabolism 00010 Glycolysis / Gluconeogenesis [PATH:ko00010] K00845 glk; glucokinase [EC:2.7.1.2]
需求
修正现有Perl代码的逻辑问题,在不引入JSON模块的前提下实现符合预期的TSV转换。
内容的提问来源于stack exchange,提问作者Tiendu
相关产品推荐
相关产品推荐

