如何修改Perl数组中特定列的所有值的格式?

时间:2017-03-25 19:40:27

标签: arrays regex perl multidimensional-array dbi

我正在从结果集中读取每一行(多维数组,因为行和列是动态的),并修改数组中特定位置的所有日期字段的格式。但是这需要花费很多时间,因为结果集会返回更多行。

下面是我用来更改行级别的示例代码,是否有可能使用regexp更改数组中的整列值?还是以其他方式来改进这个计划?

$sth = $dbh->prepare( "BEGIN TESTPROC(?, ?, ?); END;" );

$sth->bind_param( 1, 'GMS_JOB_NAME' );
$sth->bind_param_inout( 5, \$ResultSet, 0, { ora_type => ORA_RSET } );
$sth->bind_param_inout( 6, \$out_date, VARCHAR2 );

unless ( $sth->execute() ) {
    print "Couldnt be invoked";
}

my $temp_file = "/user/test.csv";
my $i         = 0;
my $flag      = 0;

my @type;
my @precision;
my @date_type;

if ( $flag == 0 ) {

    $j = 0;

    while ( $i < $num_fields ) {

        $type[$i]      = $ResultSet->{TYPE}->[$i];
        $precision[$i] = $ResultSet->{PRECISION}->[$i];

        if ( $type[$i] == 93 and $precision[$i] == 75 ) {
            $date_type[$j] = $i;
            $j = $j + 1;
        }

        $i = $i + 1;
    }

    $flag = 1;
}

$i = 0;

if ( $out_date ) {

    unless ( open( FH, '>>', "$temp_file" ) ) {
        print "Unable to open the Report file $temp_file";
    }

    $file_check = 1;
    my $num_fields = $ResultSet->{NUM_OF_FIELDS};

    while ( @record = $ResultSet->fetchrow_array ) {

        $record_flag = 1;

        foreach $k ( @date_type ) {

            if ( defined $record[$k] ) {

                my $pos = rindex( $record[$k], "." );

                $record[$k] =~ s/\./:/g;

                if ( $pos ne -1 ) {
                    substr( $record[$k], $pos, 1 ) = ".";
                }

                my $dt = `date -d"$record[$k]" +"%d-%b-%Y"`;
                chomp( $dt );

                $dt = uc $dt;

                $record[$k] = $dt;
            }

        }

        if ( index( $record[0], "\"" ) eq -1 ) {
            my $data = join( '","', @record );
            $data = '"' . $data . '"';
        }
    }


$dbh->commit();
$sth->finish();
$ResultSet->finish();

以下是包含10列和7行的示例数据。这将从数据库中检索到数组$ResultSet,空格为分隔符。

结果集不限于此行数和列数;它可能在数千列中有数百万行。

根据以下数据,我想更改结果集中第3,4和5列中所有值的日期格式。当前的方法是逐行进行并将其写入CSV文件,但这很慢。

还有更好的选择吗?

    1 A 2014/09/09 2014/09/09 2014/09/09 AMETIC NONRRA 1 122121 1212.432
    2 b 2014/09/09 2014/01/09 2014/09/09 AMETIC NONRRA 1 122121 1212.432
    3 B 2014/09/09 2014/04/09 2014/09/09 AMETIC NONRRA 1 122121 1212.432
    4 R 2014/09/09 2014/05/09 2014/09/09 AMETIC NONRRA 1 122121 1212.432
    5 G 2014/09/09 2014/07/09 2016/09/09 AMETIC NONRRA 1 122121 1212.432
    6 DD 2014/09/09 2015/03/09 2014/09/09 AMETIC NONRRA 1 122121 1212.432
    7 DSSS 2014/09/09 2015/09/06 2015/09/09 AMETIC NONRRA 1 122121 1212.432

0 个答案:

没有答案