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

Lea*_*Cpp 1 regex perl

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

输入:这只是一个示例输入,实际输入是巨大的,仅一行

[{"mnemonic":"PT.IA1","ID":"000628"},  {"mnemonic":"EOR.1","ID":"000703"}]
Run Code Online (Sandbox Code Playgroud)

代码:我试图通过将定界符设置为}来读取文件,以便获取每个值,但是作为单行文件,它将所有内容打印为一个,我如何通过为此设置定界符来解析此行行,拆分功能足以完成这项工作吗?

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";
}
Run Code Online (Sandbox Code Playgroud)

输出量

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

谢谢您的帮助

Dav*_*oss 5

人们在评论中所说的一切都是事实。JSON 是一种复杂的数据格式,期望在不使用现有工具的情况下解析它是极其愚蠢的。我强烈建议您解决阻碍您安装和使用 JSON 解析器的任何障碍。

然而...

如果您只需要 ID,并且格式始终与示例数据相同,那么有一种方法可以实现。这段代码非常脆弱,我无法充分强调这是一个多么糟糕的主意。但这段代码似乎适用于您的示例数据。

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

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

它从 STDIN 读取并写入 STDOUT,因此这样调用它:

$ ./parse_json.pl < Etot_data.txt
Run Code Online (Sandbox Code Playgroud)

但请安装 JSON 解析器。


ste*_*ieb 5

如果您无法安装任何外部模块,则可以将其包括在内。

JSON在脚本所在的目录中创建一个目录,然后复制JSON :: PP模块的内容,并将其放入刚创建PP.pmJSON目录内的文件中。然后,在脚本中,将当前工作目录添加为库目录:use 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";
}
Run Code Online (Sandbox Code Playgroud)

输出:

abc.000628
abc.000703
Run Code Online (Sandbox Code Playgroud)

如果您只需要稍作改动就可以隐藏已经创建了其他模块的事实,则可以对模块进行一些更改,并将其直接包含在脚本本身中。

请注意,这JSON::PP是v5.14 +中的Perl核心。OP在评论中表示他们在5.10上。