0

タブ区切りのテキスト ファイルに解析する必要があるデータがいくつかあります。データは次のようになります。

>beer/name: Sausa Weizen beer/beerId: 47986 beer/brewerId: 10325 beer/ABV: 5.00 beer/style: Hefeweizen review/appearance: 2.5
> review/aroma: 2 review/palate: 1.5 review/taste: 1.5 review/overall:
> 1.5 review/time: 1234817823 review/profileName: stcules review/text: A lot of foam. But a lot.    In the smell some banana, and then lactic and
> tart. Not a good start.   Quite dark orange in color, with a lively
> carbonation (now visible, under the foam).    Again tending to lactic
> sourness. Same for the taste. With some yeast and banana.     
> 
> beer/name: Red Moon ...repeats millions of times...

` 次のようにする必要があります:

サウサ ヴァイツェン {tab} 47986 {tab} 10325 {tab} ...

始めるために使用できる perl コードの例を誰かが持っていますか? 私は Perl を初めて使用し、サイトで見つけた他のいくつかの例をいじくり回しましたが、私のコンテキストではそれらを動作させることができませんでした。

Vim と次の perl で正規表現を使用してみました:

#!/usr/bin/perl
#parse_file_kv.pl
use strict;
use warnings;
my $save_input_record_separator = $/; #Save original value before changing it
undef $/; # enable slurp mode
open(my $file ,"ratebeer.txt");
$/ = $save_input_record_separator; #Restore original value to this global variable
my %h = $file =~ m/\w+/g;#Read keys and values from file into hash %h
for (keys %h){
    print "KeyWord $_ has value $h{$_}.\n";
}
print "\n";
my @kws2find = qw(beer/name);
foreach ( @kws2find ){
    find_value($_);
}
sub find_value{
    my $kw = shift @_;
    if (exists $h{$kw}){
        print "Value of $kw is $h{$kw}\n";
    }else{
        print "Keyword $kw is not found in hash\n";
    }
}
4

1 に答える 1

0

Perl では、これを行う方法がたくさんありますが、最小限のものを紹介します。

# a sample input line.  In reality you would read it from a file and chomp off the \n.
my $foo = "beer/name: Sausa Weizen beer/beerId: 47986 ...\n";

# replace foo/bar: with a tab everywhere in the line.  
# I used A-Za-z as the chars to match, you can do many more things (including more
# elegant ways of specifying whole character classes).
#
$foo =~ s/[A-Za-z]*\/[a-zA-Z]*:/\t/g;

# print it out.
print "$foo\n";
于 2013-10-19T03:08:24.923 に答える