Чтение CSV-файла в ha sh дает неверный результат - PullRequest
0 голосов
/ 13 марта 2020

У меня есть файл 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 для чтения файла в ha sh:

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;
}

Но возвращенный ха sh выглядит так:

 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-файл может содержать больше строк и столбцов)

1 Ответ

1 голос
/ 13 марта 2020

Примеры данных, которые вы нам показываете, не соответствуют вашему коду. Код хочет разделить данные по символам канала. Но данные не содержат никаких символов канала. Поэтому я не уверен, как это сработает.

Однако я вполне уверен, что проблема в этой строке:

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

Первый аргумент split() регулярное выражение А символ трубы - это метасимвол регулярного выражения. Чтобы использовать метасимвол сам по себе, вам нужно экранировать его с помощью обратного слэса sh.

my @data = split(/\|/, $lines);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...