如何使用Perl以json格式存储文本文件中的文本

时间:2017-08-27 20:33:06

标签: json perl

我想知道如何使用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"}};
}

1 个答案:

答案 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行的假设,每次啤酒的元数据每次都是相同的顺序。但是,如果不出意外,这可能是一个很好的起点吗?