如何解析JSON文件,而无需使用JSON库和JSON解析器
下面是输入和输出的详细如何解析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解析器和我没有使用它
感谢您的帮助
如果不能安装任何外部模块,可以肯定的是包括它...
在同一目录下你的脚本是在创建一个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。
我们可以直接读取文件附加$ J 像下面 $ J =
@LearningCpp没错...应答更新 – stevieb
我已经下载JSON/JSON-2.90/lib/JSON/backportPP /,会这样吗? – LearningCpp
一切,人们在评论中所说的是真实的选项。 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解析器。
http://www.perlmonks.org/?node_id=995856 – toolic
CPAN上的JSON解析器的源代码可用。你可以阅读,看看他们是如何做到的。 https://metacpan.org/source/MAKAMAKA/JSON-PP-2.27400/lib/JSON/PP.pm – Quentin
*我没有json解析器,我没有选择使用它。不太可能:http://www.perlmonks.org/?node=693828 – Quentin