首页 > 解决方案 > 读取 CSV 文件以散列会给出不正确的结果

问题描述

我有 csv 文件包含(简化的 SQL 查询):

SQL_QRY
"insert into TTL_CCL_DB_INF.D_1244_CRB_PARTY_EXT (CD_REC_PARTY, CD_REC_OBJECT_TYPE, T_FULL_NAME, ..) select * from TTL_CCL_DB_STG.D_1244_CRB_PARTY aa1 inner join TTL_CCL_DB_STG.D_1244_CRB_COMPANYFACT bb1 on aa1.CD_REC_PARTY = bb1.CD_REC_PARTY"

我有一个 perl 脚本来将文件读入哈希:

sub somesub {
  ...
  my $fh;
  my $key;

  eval { open($fh, '<', $tmp_file); };

  if ($@) { 
    $errmsg = $@;
    croak {message=>$errmsg};
  };

  while(my $lines = <$fh>) {
    chomp $lines;
    my @data = split(/|/, $lines);
    $key = shift @data;
    $data_rt{$key} = \@data; 
  };
  close $fh;
  unlink $tmp_file;

  return %data_rt;
}

但返回的哈希看起来像:

 RETURN >>>>$VAR1 = {
' => [],  'SQL_QRY
          '"insert into TTL_CCL_DB_INF.D_1244_CRB_PARTY_EXT (CD_REC_PARTY, CD_REC_OBJECT_TYPE, T_FULL_NAME, CD_TAX_IDENTIFIER, CD_VAT_IDENTIFIER,DWH_TRANSFRM_ID, DWH_TRANSFRM_RUN_ID, DWH_BD, DWH_VSN_NO ) select aa1.CD_REC_PARTY, aa1.CD_REC_OBJECT_TYPE, aa1.T_FULL_NAME, bb1.CD_TAX_IDENTIFIER, bb1.CD_VAT_IDENTIFIER,  $transfrmId, \'$transfrmRunId\', cast(\'$bnsDt\' as date format \'YYYYMMDD\'), $occNbr from TTL_CCL_DB_STG.D_1244_CRB_PARTY aa1 inner join TTL_CCL_DB_STG.D_1244_CRB_COMPANYFACT bb1 on aa1.C' => []ARTY = bb1.CD_REC_PARTY and cast(aa1.DWH_BD as date format \'YYYYMMDD\') = \'$10000050_dwh_bd\' and aa1.DWH_VSN_NO = $10000050_vsn_no and cast(bb1.DWH_BD as date format \'YYYYMMDD\') = \'$10000034_dwh_bd\' and bb1.DWH_VSN_NO = $10000034_vsn_no"
        };

有人会帮助我如何正确地做到这一点吗?我需要让它尽可能灵活(csv文件可以包含更多的行和更多的列)

标签: csvperl

解决方案


您向我们展示的示例数据似乎与您的代码不匹配。该代码想要拆分管道符号上的数据。但数据不包含任何管道符号。所以我不确定这将如何工作。

但是,我非常有信心问题出在这条线上:

my @data = split(/|/, $lines);

第一个参数split()是一个正则表达式。管道符号是正则表达式元字符。为了将元字符用作自身,您需要使用反斜杠对其进行转义。

my @data = split(/\|/, $lines);

推荐阅读