2017-08-27 82 views
-2

我想知道如何使用Perl以Json格式存儲文本文本。從文本文件如何使用Perl以json格式存儲文本文本

文本

23rd Street Wave the Wheat Ale 

Lawrence, Kansas, USA 

5.2 

13.65 

Rating - 0.00 

3 Guys & A Beer’d Wheat the People 

Carbondale, Pennsylvania, USA 

5.2 

Unknown 

Rating - 0.00 

51 North Paint Creek Wheat 

Lake Orion, Michigan, USA 

4.8 

Unknown 

Rating - 0.00 

我曾試圖執行代碼,但它失敗了,因爲我發現,Perl可以使用,而在互聯網上循環讀取文件。

下面是我的Perl腳本

for($i = 0; $i < $fileSize; $i+2){ 
say qq{{"beerName": "$beerName", 
"location":"$location", 
"ABV":"$ABV", 
"IBU":"$IBU", 
"Rating":"$Rating"}}; 
} 
+2

使用模塊[JSON](http://search.cpan.org/~ishigaki/JSON-2.94/lib/JSON.pm) – zdim

+3

「失敗」是什麼意思?當你運行你的程序時會發生什麼?你預期會發生什麼?發表一個https://stackoverflow.com/help/mcve – Robert

+0

我很困惑...你要求幫助存儲數據,但是你顯示一個文本文件而不是數據結構?! – ikegami

回答

1

不知道你的文本文件的結構是什麼,以及如何一致的是。我認爲每個條目都是5行,每個條目的順序相同。如果是這種情況,可能有一種方法是一次讀取5行文本文件,將每行分配給相應的散列鍵,然後將該散列值存儲在一個數組中,稍後我們可以使用該數組作爲JSON結構體。也許一個更優雅的方式做到這一點,但對於這樣的事情:

#!/usr/bin/perl 
use strict; 
use warnings; 
use autodie; 

use JSON; 

my $input_file = shift; 
my @results; 

open(my $fh, "<", $input_file); 
# Read the text file 5 lines at a time, and store each line in the hash data with the desired keys. 
while ((my @lines) = map { scalar(<$fh>) or() } 0..4) { 
    my %data = ('beername' => $lines[0], 
       'location' => $lines[1], 
       'ABV'  => $lines[2], 
       'IBU'  => $lines[3], 
       'Rating' => $lines[4], 
    ); 
    # Store these hash refs in an array that we'll later convert to JSON. 
    push(@results, \%data); 
} 

# Write results to file. 
open(my $json_out, ">", 'beers.json'); 
print {$json_out} encode_json(\@results); 

這將導致「beers.json」文件,該文件將具有以下結構:

$ json_xs <beers.json 
[ 
    { 
     "ABV" : "5.2\n", 
     "IBU" : "13.65\n", 
     "location" : "Lawrence, Kansas, USA\n", 
     "Rating" : "Rating - 0.00\n", 
     "beername" : "23rd Street Wave the Wheat Ale\n" 
    }, 
    { 
     "ABV" : "5.2\n", 
     "IBU" : "Unknown\n", 
     "location" : "Carbondale, Pennsylvania, USA\n", 
     "Rating" : "Rating - 0.00\n", 
     "beername" : "3 Guys & A Beerââ¬â¢d Wheat the People\n" 
    }, 
    { 
     "location" : "Lake Orion, Michigan, USA\n", 
     "Rating" : "Rating - 0.00\n", 
     "beername" : "51 North Paint Creek Wheat\n", 
     "IBU" : "Unknown\n", 
     "ABV" : "4.8\n" 
    } 
] 

就像我說的,可能不夠高雅,完全依賴於每個啤酒的文件長度爲5行,每個啤酒的元數據每次都是相同的順序。但是,如果沒有別的辦法,這可能是一個很好的起點?

+0

Thx,這就是我想要的,對那些試圖解決這個問題的人感到抱歉,我會在提問時提高自己。 – ZiSean

相關問題