2016-09-20 174 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解析器。