如何用Perl脚本将CSV文件列转成行写入新文件?数组定义遇问题
解决CSV列转行的Perl代码问题
需求与示例
需要将任意行列数的CSV文件实现列转行,并写入新文件。
示例输入CSV
sim_time,a,b,c,d 0,0,0,0,0 12,0,1,1,0 115,1,1,1,1 200,0,0,1,0
期望输出
sim_time 0 12 115 200 a 0 0 1 0 b 0 1 1 0 c 0 1 1 1 d 0 0 1 0
现有代码问题
你尝试的代码中,push ("@x_{$a}", $columns[$a])这种动态定义数组的方式不符合Perl语法,无法实现按列存储数据。此外代码存在重复split、未正确使用局部变量等问题。
现有代码:
#!/usr/bin/perl my $file = "report_69.csv"; my $column_separator = ','; open (my $INFILE, "<" , "$file"); open(my $FILE,">","report_69.txt") or die "$!"; while (<$INFILE>) { chomp; my @c = split(',', $_); my $d = @c; print $d; my @columns = split(/$column_separator/); for( $a = 0; $a < $d; $a = $a + 1 ) { push ("@x_{$a}", $columns[$a] ); # the problem (1) } }
解决方案
使用数组的数组来存储每一列的所有数据,这是Perl中处理这类行列转换的标准方式。
修正后的完整代码
#!/usr/bin/perl use strict; use warnings; # 开启警告,方便排查问题 my $in_file = "report_69.csv"; my $out_file = "report_69.txt"; my $sep = ','; open my $IN, '<', $in_file or die "无法打开输入文件: $!"; open my $OUT, '>', $out_file or die "无法打开输出文件: $!"; my @columns_data; # 数组的数组,每个子数组对应一列的数据 while (my $line = <$IN>) { chomp $line; my @fields = split /\Q$sep\E/, $line; # \Q转义分隔符,避免特殊字符冲突 for my $i (0 .. $#fields) { push @{ $columns_data[$i] }, $fields[$i]; # 将当前字段推入对应列的子数组 } } # 将每列数据转为行写入输出文件 foreach my $col (@columns_data) { print $OUT join(' ', @$col), "\n"; } close $IN; close $OUT;
关键说明
@columns_data的作用:这是一个二维数组,$columns_data[0]对应原CSV第一列的所有数据,$columns_data[1]对应第二列,以此类推。push @{ $columns_data[$i] }, $fields[$i]:Perl中需要用@{...}来解引用数组引用,确保将字段推入正确的子数组。split /\Q$sep\E/, $line:用\Q和\E包裹分隔符,避免分隔符包含正则特殊字符(比如|)时出错。- 开启
strict和warnings:强制规范变量声明,提前发现语法或逻辑问题。
内容的提问来源于stack exchange,提问作者vikas
相关产品推荐
相关产品推荐

