2016-09-20 113 views
-1

下面是输入和输出的详细如何解析JSON文件,而无需使用JSON库和JSON解析器

输入:这只是一个样本输入和实际投入是巨大的,只是在单行

[{"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”。它 最终字符串看起来像abc.000628或abc.000703,并将其保存在散列 除了在json字符串中的ID不需要其他值 是否有可能读取JSON文件作为一个普通的文件和操作它。 我没有JSON解析器和我没有使用它

感谢您的帮助

+0

http://www.perlmonks.org/?node_id=995856 – toolic

+2

CPAN上的JSON解析器的源代码可用。你可以阅读,看看他们是如何做到的。 https://metacpan.org/source/MAKAMAKA/JSON-PP-2.27400/lib/JSON/PP.pm – Quentin

+5

*我没有json解析器,我没有选择使用它。不太可能:http://www.perlmonks.org/?node=693828 – Quentin

回答

4

如果不能安装任何外部模块,可以肯定的是包括它...

在同一目录下你的脚本是在创建一个JSON目录,然后复制JSON::PP模块的内容,并将其放入您刚创建的JSON目录内的PP.pm文件。然后,在您的脚本中,将当前工作目录添加为库目录: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"; 
} 

输出:

abc.000628 
abc.000703 

如果你需要隐藏你已经创建了一个附加模块,只有轻微的finagling事实上,你可以做一些更改模块,并直接在包括它脚本本身。

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

+0

我们可以直接读取文件附加$ J 像下面 $ J = ) – LearningCpp

+0

@LearningCpp没错...应答更新 – stevieb

+0

我已经下载JSON/JSON-2.90/lib/JSON/backportPP /,会这样吗? – LearningCpp

4

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

但是......

如果你只想要ID,格式总是与你的样本数据,那么还有一个办法做到这一点。这段代码非常脆弱,我无法强调这是多么糟糕的主意。但是这段代码似乎适用于您的示例数据。

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

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

它从标准输入读取和写入到标准输出,所以这样称呼它:

$ ./parse_json.pl < Etot_data.txt 

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