You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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;

关键说明

  1. @columns_data的作用:这是一个二维数组,$columns_data[0]对应原CSV第一列的所有数据,$columns_data[1]对应第二列,以此类推。
  2. push @{ $columns_data[$i] }, $fields[$i]:Perl中需要用@{...}来解引用数组引用,确保将字段推入正确的子数组。
  3. split /\Q$sep\E/, $line:用\Q和\E包裹分隔符,避免分隔符包含正则特殊字符(比如|)时出错。
  4. 开启strict和warnings:强制规范变量声明,提前发现语法或逻辑问题。

内容的提问来源于stack exchange,提问作者vikas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:20:26