在Perl中将表格文本文件转换为csv

在Perl中将表格文本文件转换为csv,csv,perl,Csv,Perl,我有一个文件,其中包含固定宽度记录格式的内容列表,例如 名称去年重量今年重量 艾丽丝130 135 鲍勃170 165 克里斯190210 丹尼尔195185 埃里克150 170 我想将其转换为csv文件。我知道我可以使用Text::cvsxs来实现这一点,但我只是很难理解它。我见过很多cvs文本示例,但是没有一个文本已经是表格格式的。这是否意味着,我必须将其从表格格式更改为中间添加逗号?或者Text::CVS是为我做的 open my $file1, '<', $a or die $

我有一个文件,其中包含固定宽度记录格式的内容列表,例如

名称去年重量今年重量
艾丽丝130 135
鲍勃170 165
克里斯190210
丹尼尔195185
埃里克150 170
我想将其转换为csv文件。我知道我可以使用Text::cvsxs来实现这一点,但我只是很难理解它。我见过很多cvs文本示例,但是没有一个文本已经是表格格式的。这是否意味着,我必须将其从表格格式更改为中间添加逗号?或者Text::CVS是为我做的

open my $file1, '<', $a or die $!;

chomp $file1;
my $csv = Text::CSV_XS->new ({ binary => 1, auto_diag => 1 });

while(<$file1>){
#table to csv code 
}

$csv->eol ("\r\n");
    open $fh, ">:encoding(utf8)", "table.csv" or die "Couldn't open 'table.csv': $!";

    $csv->print ($fh, $_);
    close $fh;
    close $file1;


打开我的$file1,”我想你指的是固定宽度的记录格式

use strict;
use warnings;
use autodie;
use Text::CSV_XS qw();
open my $in, '<', 'so-57352269.txt';
open my $out, '>:encoding(UTF-8)', 'table.csv';
my @column_widths = (6, 5, 6);
my $csv = Text::CSV_XS->new({binary => 1, auto_diag => 1});
while (my $line = $in->getline) {
    chomp $line;
    my $pack_format = join '', map { "a$_" } @column_widths;
    my @record = unpack $pack_format, $line;
    $csv->say($out, \@record);
}
使用严格;
使用警告;
使用自动模具;
使用Text::CSV_XS qw();
打开我的$in,':编码(UTF-8)''table.csv';
我的@列宽=(6,5,6);
我的$csv=Text::csv_XS->new({binary=>1,auto_diag=>1});
while(my$line=$in->getline){
chomp$行;
my$pack_format=join“”,映射{“a$u”}@column_widths;
my@record=解包$pack\u格式,$line;
$csv->say($out,\@record);
}

我想你指的是固定宽度的记录格式

use strict;
use warnings;
use autodie;
use Text::CSV_XS qw();
open my $in, '<', 'so-57352269.txt';
open my $out, '>:encoding(UTF-8)', 'table.csv';
my @column_widths = (6, 5, 6);
my $csv = Text::CSV_XS->new({binary => 1, auto_diag => 1});
while (my $line = $in->getline) {
    chomp $line;
    my $pack_format = join '', map { "a$_" } @column_widths;
    my @record = unpack $pack_format, $line;
    $csv->say($out, \@record);
}
使用严格;
使用警告;
使用自动模具;
使用Text::CSV_XS qw();
打开我的$in,':编码(UTF-8)''table.csv';
我的@列宽=(6,5,6);
我的$csv=Text::csv_XS->new({binary=>1,auto_diag=>1});
while(my$line=$in->getline){
chomp$行;
my$pack_format=join“”,映射{“a$u”}@column_widths;
my@record=解包$pack\u格式,$line;
$csv->say($out,\@record);
}

您所说的“表格格式”到底是什么意思?代表您实际数据的实际样本数据会有所帮助。你的专栏里有空格吗?列是如何分开的?很难从一堆点中分辨出来。@Shawn很抱歉!我试图保持它的简单,这样我就可以接受这个想法,然后把它应用到更大规模的工作中。柱之间用空格隔开。printf与“%-*s%*s%*s\n”一起使用,@sfr字段是否可以包含空格?@melpomene下面的答案更正了我的选择。我的意思是“固定宽度记录格式”。是的,如果其中一列中假定有一个空白字段,则它们可以包含空格。您所说的“表格格式”到底是什么意思?代表您实际数据的实际示例数据会有所帮助。你的专栏里有空格吗?列是如何分开的?很难从一堆点中分辨出来。@Shawn很抱歉!我试图保持它的简单,这样我就可以接受这个想法,然后把它应用到更大规模的工作中。柱之间用空格隔开。printf与“%-*s%*s%*s\n”一起使用,@sfr字段是否可以包含空格?@melpomene下面的答案更正了我的选择。我的意思是“固定宽度记录格式”。是的,如果其中一列中应该有一个空白字段,它们可以包含空格。谢谢您的更正:)我无法使用say,我假设这可能是由于我的perl版本。我尝试了打印,但这完全混淆了输出。我想知道这是因为我使用了打印还是因为使用了定义的列宽。是的,谢谢你的更正:)我无法使用say,我假设这可能是由于我的perl版本。我尝试了打印,但这完全混淆了输出。我想知道这是因为我使用了打印还是因为使用了定义的列宽。