我是初学者。我正在尝试将 CSV 文件中的值分配给哈希。我整天都很累。我已经合上了手。我的csv:
currency,asset,exchange,strategy,profit,profitday,yearlyprofit,marketchange,profitmarket,tradeamount,tradesday,winingtrades,lossetrades,percentagewins,bestwin,medianwins,worstloss,medianloss,candlesize,warmupperiod,daysofdataset,backteststart,datasetfrom,datasetto,pricevolality,note
USD,BTC,bitfinex,BBRSI,0.00,-1,0,-2.55,2.55,0,-1,0,0,-1,,na,,na,5,144,0,"2018-03-25 01:15:39","2018-03-24 00:00:00","2018-03-24 12:00:00",11.20,"shorter period"
USD,XMR,bitfinex,BBRSI,0.00,-1,0,-2.18,2.18,0,-1,0,0,-1,,na,,na,5,144,0,"2018-03-25 01:15:39","2018-03-24 00:00:00","2018-03-24 12:00:00",17.41,"shorter period"
行尾为 \r。
脚本:
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my $csvfile = 'gekko/backtestbitfinex/testowy.csv';
my $obj;
use Text::CSV::Hashify;
# Object-oriented interface
use Text::CSV::Hashify;
$obj = Text::CSV::Hashify->new( {
file => $csvfile,
format => 'hoh', # hash of hashes, which is default
key => 'asa',
#eol => 'rn',
sep_char => ',',
quote_char => '',
escape_char => '',
binary => 1,
decode_utf8 => 0,
auto_diag => 1,
diag_verbose => 1,
blank_is_undef => 0,
empty_is_undef => 0,
allow_whitespace => 1,
allow_loose_quotes => 1,
allow_loose_escapes => 1,
allow_unquoted_escape => 1,
always_quote => 1,
quote_empty => 1,
quote_space => 1,
escape_null => 1,
quote_binary => 1,
keep_meta_info => 1,
verbatim => 0,
} );
print Dumper $obj;
输出错误:
Use of uninitialized value $kk in hash element at /usr/local/share/perl/5.22.1/Text/CSV/Hashify.pm line 353, <GEN0> line 2.
Use of uninitialized value $kk in hash element at /usr/local/share/perl/5.22.1/Text/CSV/Hashify.pm line 357, <GEN0> line 2.
Use of uninitialized value $kk in hash element at /usr/local/share/perl/5.22.1/Text/CSV/Hashify.pm line 359, <GEN0> line 2.
Use of uninitialized value $kk in hash element at /usr/local/share/perl/5.22.1/Text/CSV/Hashify.pm line 353, <GEN0> line 3.
Use of uninitialized value $kk in concatenation (.) or string at /usr/local/share/perl/5.22.1/Text/CSV/Hashify.pm line 354, <GEN0> line 3.
Key '' already seen at csv.pl line 13.
默认情况下,当我设置时:eol => 'rn',
得到错误:'_ERROR_DIAG' => 'EOF - End of data in parsing input stream',
我的 CSV 有什么问题?
粗略查看模块后:
您指定了"asa"作为键,但您的数据缺少该字段。
这会导致:Key '' already seen at csv.pl line 13.
出现警告是因为您使用-w
选项运行脚本(也因为模块作者没有处理未初始化的变量(。
通常,使用 no warnings 'uninitialized';
来静音来自代码的预期警告(将其范围限定为所需的最小块(。
在这种情况下,警告来自您无法控制的模块代码(好吧,您可以修补它,但这当然应该避免(。
要缓解此问题,您可以:
- 不要使用
-w
覆盖模块的警告级别,请使用use warnings
,这仅适用于您的代码。
带有 $SIG{__WARN__} = &handler_sub
的模块发出的陷阱警告(更多详细信息:perldoc perlvar
->%SIG
(。 不过,这并不能保证适用于每个模块。