App-Chart

 view release on metacpan or  search on metacpan

devel/convert-scm.pl  view on Meta::CPAN

              decimals => 2 };
    my $decimals = 0;

    my $filename = "$ENV{HOME}/Chart/data/$symbol";
    open IN, '<', $filename or die;

    foreach my $line (<IN>) {
      if ($line =~ /\(([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)( ([0-9]+))?/) {
        my ($date, $open, $high, $low, $close, $volume, $openint)
          = ($1,$2,$3,$4,$5,$6,$8);

        push @data, { symbol  => $symbol,
                      date    => App::Chart::tdate_to_iso ($1),
                      open    => insert_decimal ($2, $decimals),
                      high    => insert_decimal ($3, $decimals),
                      low     => insert_decimal ($4, $decimals),
                      close   => insert_decimal ($5, $decimals),
                      volume  => $6,
                      openint => $8 };
        $records++;
        next;
      }

      $line =~ s/\#f/\"\"/g;
      $line =~ s/\#t/1/g;
      my $arrayref = Lisp::Reader::lisp_read($line);
      my $form = $arrayref->[0];
      if ($option_verbose >= 2) { print Dumper(\$form); }
      next if ! defined $form; # blank or only comments

      if ($form->[0] eq 'decimals') {
        $decimals = $form->[1];
        if ($option_verbose) {
          print "decimals $decimals\n";
        }

      } elsif ($form->[0] eq 'currency') {
        my $currency = $form->[1];
        if ($option_verbose) { print "currency $currency\n"; }
        $h->{'currency'} = $currency;

      } elsif ($form->[0] eq 'name') {
        my $name = $form->[1];
        if ($option_verbose) { print "name $name\n"; }
        $h->{'name'} = $name;

      } elsif ($form->[0] eq 'dividend') {
        my $date = App::Chart::tdate_to_iso ($form->[1]);
        $form = $form->[2];

        if (! ref($form)) {
          # string dividend
          my $str = $form;
          if ($option_verbose) {
            print "dividend $date \"$str\"\n";
          }
          my $amount;
          my $imputation;
          my $qualifier;
          my $note;
          if (Scalar::Util::looks_like_number ($str)) {
            $amount = $str;
          } elsif ($amount eq 'unknown') {
            $qualifier = 'unknown';
          } elsif ($amount eq 'To be Advised') {
            $qualifier = 'TBA';
          } else {
            print "string dividend \"$str\"\n";
            $note = $str;
          }
          push @dividends, { symbol    => $symbol,
                             ex_date   => $date,
                             amount    => $amount,
                             qualifier => $qualifier,
                             note      => $note};

        } elsif ($form->[0] eq 'split') {
          my $new = $form->[1];
          my $old = $form->[2];
          if ($option_verbose) {
            print "split $date, $new, $old\n";
          }
          push @splits, { symbol => $symbol,
                          date => $date,
                          new  => $new,
                          old  => $old };

        } elsif ($form->[0] eq 'amount') {
          # structured value

          my $decimals = 0;
          my $amount = $form->[1];
          my $imputation;
          my $qualifier;

          my @array = @$form;
          foreach my $elem (@array[2..$#array]) {
            if ($elem->[0] eq 'decimals') {
              $decimals = $elem->[1];
            } elsif ($elem->[0] eq 'imputation') {
              $imputation = $elem->[1];
            } elsif ($elem->[0] eq 'estimated') {
              if ($elem->[1] != 0) {
                $qualifier = 'estimated';
              }
            } else {
              print "unrecognised dividend element: ",$elem->[0],"\n";
            }
          }

          $amount  = insert_decimal ($amount, $decimals);
          if ($imputation && ! ($imputation =~ /\./)) {
            $imputation  = insert_decimal ($imputation, $decimals);
          }

          if ($option_verbose) {
            print "dividend $date '",($amount||''),", '",($imputation||''),"'\n";
          }
          push @dividends, { symbol     => $symbol,
                             ex_date    => $date,
                             amount     => $amount,



( run in 0.470 second using v1.01-cache-2.11-cpan-6aa56a78535 )