我想知道如何使用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可以在互联网上使用while循环读取文件。
以下是我的Perl脚本
for($i = 0; $i < $fileSize; $i+2){
say qq{{"beerName": "$beerName",
"location":"$location",
"ABV":"$ABV",
"IBU":"$IBU",
"Rating":"$Rating"}};
}
答案 0 :(得分: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);
这将导致&#34; beers.json&#34;将具有以下结构的文件:
$ 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行的假设,每次啤酒的元数据每次都是相同的顺序。但是,如果不出意外,这可能是一个很好的起点吗?