Выходной файл пуст - PullRequest
       2

Выходной файл пуст

0 голосов
/ 15 января 2019

Я не знаю, почему следующий код выводит пустой файл. Я использую Windows 8. Я получил помощь от этого сообщества за предыдущую помощь по Perl, и это только то, что я смог собрать вместе с помощью, которую я получил. Тем не менее, я не могу понять, где этот сценарий не работает.

#! perl
use strict;
use warnings;
use HTML::FormatText;
use LWP::Simple;

my $dateField = 'date=2018-12-31';
my $currency  = "USD";
my $filename = 'C:\Users\Name\Desktop\doc3.txt';
my $address = "https://www.oanda.com/rates/api/v1/rates/$currency.csv?api_key=gpolonsky&decimal_places=4&$dateField&fields=averages&quote=USD&quote=AUD&quote=BRL&quote=CAD&quote=GBP&quote=CHF&quote=CNY&quote=DKK&quote=HKD&quote=INR&quote=IDR&quote=ILS&quote=JPY&quote=MXN&quote=NOK&quote=PHP&quote=PLN&quote=SGD&quote=sKK&quote=ZAR&quote=KRW&quote=SEK&quote=TWD&quote=THB&quote=EUR&quote=MYR&quote=NZD&quote=SAR&quote=TRY&quote=RUB&quote=CZK&quote=AED&quote=CLP&quote=EGP&quote=MAD&quote=NGN&quote=OMR&quote=QAR";
my $content = get($address);
my $s = 1;

defined $content or die "Cannot read '$address': $!";
$content =~  s/^[^\n]*\n//s; 
$content =~  s/^/20181231,/gm; # The m option makes ^ match at the start of each line
$content =~  s/,2018-12-3[0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]\+0000*//g;
$content =~  s/([A-Z][A-Z][A-Z]),[0-9]*\.[0-9][0-9][0-9][0-9]/$1/g;

my $string = HTML::FormatText->format_string(
    $content,
    leftmargin  =>  0,
    rightmargin => 23,
);

open(my $file, '>', $filename) or die $!;
print $file $string;

my @curOrd = qw( USD AUD BRL GBP CAD CNY DKK HKD INR IDR ILS JPY MXN NOK PHP PLN SGD SKK ZAR KRW SEK CHF TWD THB EUR MYR NZD SAR TRY RUB CZK AED CLP EGP MAD NGN OMR QAR );
my %data;
my $infile = 'C:\Users\Name\Desktop\doc3.txt';
my $outfile = 'file2.txt';

open (my $in, "<", $infile ) || die "can't open $infile file"; 
while (my $line = <$in>) {
    push(@{$data{(split ',', $line)[2]}}, $line);
} 
print $infile;
close $in;

open (my $out, ">", $outfile) || die "can't open $outfile file"; 
foreach my $curr (@curOrd) {
    foreach my $line (@{$data{$curr}}) {
        print $out $line;
    }
}
close $out;

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Ваша проблема в том, что вам нужно явно close() файл, в который вы пишете, прежде чем вы сможете снова открыть его для чтения из него.

Но весь этот промежуточный файл не имеет смысла (как я уже говорил ).Просто обработайте все данные в памяти перед записью их в выходной файл.

use strict;
use warnings;
use feature 'say';

use LWP::Simple;

my $dateField = 'date=2018-12-31';
my $currency  = "USD";
my $filename = 'doc3.txt';
my $address = "https://www.oanda.com/rates/api/v1/rates/$currency.csv?"
            . "api_key=gpolonsky&decimal_places=4&$dateField&fields=averages&"
            . "quote=USD&quote=AUD&quote=BRL&quote=CAD&quote=GBP&"
            . "quote=CHF&quote=CNY&quote=DKK&quote=HKD&quote=INR&"
            . "quote=IDR&quote=ILS&quote=JPY&quote=MXN&quote=NOK&"
            . "quote=PHP&quote=PLN&quote=SGD&quote=sKK&quote=ZAR&"
            . "quote=KRW&quote=SEK&quote=TWD&quote=THB&quote=EUR&"
            . "quote=MYR&quote=NZD&quote=SAR&quote=TRY&quote=RUB&"
            . "quote=CZK&quote=AED&quote=CLP&quote=EGP&quote=MAD&"
            . "quote=NGN&quote=OMR&quote=QAR";

my $content = get($address);

# I've removed $! from the die() error below. $! is the last
# *operating system* error. And making an HTTP request is not
# an operating system operation - so the contents will have no
# connection to the results of our GET request.
defined $content or die "Cannot read '$address'";
$content =~  s/^[^\n]*\n//s;
$content =~  s/^/20181231,/gm; # The m option makes ^ match at the start of each line
$content =~  s/,2018-12-3[0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]\+0000*//g;
$content =~  s/([A-Z][A-Z][A-Z]),[0-9]*\.[0-9][0-9][0-9][0-9]/$1/g;

my @curOrd = qw( USD AUD BRL GBP CAD CNY DKK HKD INR IDR ILS JPY MXN
                 NOK PHP PLN SGD SKK ZAR KRW SEK CHF TWD THB EUR MYR
                 NZD SAR TRY RUB CZK AED CLP EGP MAD NGN OMR QAR );

my $i = 1;
my %curr_lookup = map { $_ => $i++ } @curOrd;

my @data = map { [ split /,/ ] } split /\n/, $content;

my $outfile = 'file2.txt';

@data = sort { $curr_lookup{$a->[2]} <=> $curr_lookup{$b->[2]} }
        @data;

open my $out, '>', $outfile or die "Can't open $outfile for writing: $!";

say $out join ',', @$_ for @data;
0 голосов
/ 16 января 2019

Вам нужно закрыть файл $ после того, как вы получили данные с сервера и записали их в файл:

open(my $file, '>', $filename) or die $!;
print $file $string;
close($file)  # Add this line

Мне также пришлось использовать http: // вместо https: // в $ address, но я использую CentOS-систему со старой установкой LWP, которая, похоже, не поддерживает TLS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...