如何在不使用json库和json解析器的情况下解析json文件

时间:2016-09-20 12:35:48

标签: regex perl

以下是输入和输出详细信息

  

输入:这只是一个示例输入,实际输入很大,只是一行

[{"mnemonic":"PT.IA1","ID":"000628"},  {"mnemonic":"EOR.1","ID":"000703"}]
  

代码:我试图通过将分隔符设置为}来读取文件,以便我获取每个值,但是作为单个行文件,它将所有内容打印到一个,如何通过设置一个来解析此行这行的分隔符,是分割函数   足以做这份工作?

our $conf =
{
  chunk_separator   => '\{,',
}
open( FH, "Etot_Data.txt" ) or die $!;
while ( my $chunk = <FH> ){
my $sections = [ split $conf->{chunk_separator}, $chunk ]
   print "$chunk\n";
}
  

输出

我想从每个值中选择“ID”并添加“abc”。它 Final String看起来像abc.000628或abc.000703并将其保存在哈希中 除了json字符串中的ID之外,不需要其他值 是否可以将json文件作为普通文件读取并对其进行操作。 我没有json解析器,我没有选择使用它

感谢您的帮助

2 个答案:

答案 0 :(得分:4)

人们在评论中所说的一切都是真实的。 JSON是一种复杂的数据格式,并且期望在不使用已经存在的工具的情况下解析它是极其愚蠢的。我建议您修复阻止您安装和使用JSON解析器的任何障碍。

...然而

如果您只想要ID,并且格式始终与您的示例数据相同,那么有一种方法可以执行此操作。这段代码非常脆弱,我无法强调这是多么糟糕的想法。但是这段代码似乎适用于你的样本数据。

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

while (<>) {
  foreach my $id (/"ID":"(\d+)"/g) {
    say "abc.$id";
  }
}

它从STDIN读取并写入STDOUT,所以这样称呼它:

$ ./parse_json.pl < Etot_data.txt

但是请安装一个JSON解析器。

答案 1 :(得分:4)

如果您无法安装任何外部模块,您可以确保包含它......

在脚本所在的同一目录中创建一个JSON目录,然后复制JSON::PP模块的内容,并将其放入{{1}内的PP.pm文件中你刚刚创建的目录。然后,在您的脚本中,将当前工作目录添加为库目录:JSONuse lib '.';

use JSON::PP;

输出:

use warnings;
use strict;

use lib '.';

use JSON::PP qw(decode_json);

my $json;

{
    local $/;
    open my $fh, '<', 'file.json' or die $!;
    $json = <$fh>;
}

my $perl = decode_json $json;

for (@$perl){
    my $id = 'abc.' . $_->{ID};
    print "$id\n";
}

如果你需要隐藏你创建了一个附加模块的事实,只需要轻微的重写,你可以对模块进行一些更改,并将其直接包含在脚本本身中。

请注意,abc.000628 abc.000703 位于v5.14 +中的Perl核心中。 OP在评论中表示他们在5.10。