Perl 对多列文件中的每一列进行相同的编辑

Perl 对多列文件中的每一列进行相同的编辑,perl,csv,multiple-columns,fixed-width,Perl,Csv,Multiple Columns,Fixed Width,我有多个不同列数的CSV文件,需要将其重新格式化为固定格式的文本文件 在这个阶段,我对需要编辑的列进行散列和取消散列,但这很繁琐,如果不先更改程序,我就无法添加新列 是否有一种更简单的方法来读取、拆分和编辑所有列,而不考虑文件中的列数 以下是我迄今为止的代码: use strict; use warnings; my $input = 'FILENAME.csv'; my $output = 'FILENAME.txt'; open (INPUT, "<", "$input_file"

我有多个不同列数的CSV文件,需要将其重新格式化为固定格式的文本文件

在这个阶段,我对需要编辑的列进行散列和取消散列,但这很繁琐,如果不先更改程序,我就无法添加新列

是否有一种更简单的方法来读取、拆分和编辑所有列,而不考虑文件中的列数

以下是我迄今为止的代码:

use strict;
use warnings;

my $input = 'FILENAME.csv';
my $output = 'FILENAME.txt';

open (INPUT, "<", "$input_file") or die "\n !! Cannot open $input_file: $!";
open (OUTPUT, ">>", "$output_file") or die "\n !! Cannot create $output_file: $!";

while ( <INPUT> ) {

    my $line = $_;
    $line =~ s/\s*$//g;

    my ( $a, $b, $c, $d, $e, $f, $g, $h, $i, $j ) = split('\,', $line);

    $a = sprintf '%10s', $a;
    $b = sprintf '%10s', $b;
    $c = sprintf '%10s', $c;
    $d = sprintf '%10s', $d;
    $e = sprintf '%10s', $e;
    $f = sprintf '%10s', $f;
    $g = sprintf '%10s', $g;
    $h = sprintf '%10s', $h;
    $i = sprintf '%10s', $i;
    $j = sprintf '%10s', $j;

    print OUTPUT "$a$b$c$d$e$f$g$h$i$j\n";

}

close INPUT;
close OUTPUT;

exit;
使用严格;
使用警告;
my$input='FILENAME.csv';
my$output='FILENAME.txt';
打开(输入“>”、“$output\u文件”)或死亡“\n!!无法创建$output\u文件:$!”;
而(){
我的$line=$\ux;
$line=~s/\s*$//g;
my($a,$b,$c,$d,$e,$f,$g,$h,$i,$j)=拆分(“\,”,$line);
$a=sprintf'%10s',$a;
$b=sprintf'%10s',$b;
$c=sprintf'%10s',$c;
$d=sprintf'%10s',$d;
$e=sprintf'%10s',$e;
$f=sprintf'%10s',$f;
$g=sprintf'%10s',$g;
$h=sprintf'%10s',$h;
$i=sprintf'%10s',$i;
$j=sprintf'%10s',$j;
打印输出“$a$b$c$d$e$f$g$h$i$j\n”;
}
闭合输入;
闭合输出;
出口

你的意思是这样的吗

perl -aF/,/ -lne 'print map sprintf("%10s", $_), @F' FILENAME.csv > FILENAME.txt

任何时候使用顺序变量时,都应该使用数组。在这种情况下,由于您只使用了一次数组,您甚至不需要做更多的事情,只需要暂时保留它

另外:使用词法文件句柄,这是更好的练习

#!/usr/bin/env perl

use strict;
use warnings;

my $input_file  = 'FILENAME.csv';
my $output_file = 'FILENAME.txt';

my $format = '%10s';

open( my $input_fh, "<", $input_file ) or die "\n !! Cannot open $input_file: $!";
open( my $output_fh, ">>", $output_file ) or die "\n !! Cannot create $output_file: $!";

while (<$input_fh>) {
   print {$output_fh} join "", map { sprintf $format, $_ } split /,/;
}

close $input_fh;
close $output_fh;

exit;
#/usr/bin/env perl
严格使用;
使用警告;
我的$input_文件='FILENAME.csv';
my$output_file='FILENAME.txt';
我的$format='%10s';
打开(我的$input\u fh,“>”,$output\u文件)或死亡“\n!!无法创建$output\u文件:$!”;
而(){
打印{$output\u fh}join'',映射{sprintf$format,${uh}split/,/;
}
关闭$input\u fh;
关闭$output\u fh;
出口

拆分的输出提取到数组中,然后对列执行任何操作。据我所知,您希望将CSV文件更改为每个字段具有10个字符的固定宽度。“在这个阶段,我对需要编辑的列进行散列并取消散列,但这很乏味,”我不明白,而且没有证据表明您的代码中存在任何“散列”。请你解释一下你写的有什么问题,你的问题是什么?如果只是对每列使用单独的标量变量,那么答案肯定是使用数组?谢谢!!看到这样的答案我很沮丧。。所有这些编码都可以简化为一行-我学到了太多了@DKru:最重要的一课是使用数组而不是多个标量变量。这将使您自己的代码缩减约80%。谢谢!!并将记住词法文件句柄!