首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将字符串拆分为变量并使用输出作为元素

将字符串拆分为变量并使用输出作为元素
EN

Stack Overflow用户
提问于 2012-07-05 12:29:47
回答 1查看 1.2K关注 0票数 1

好吧..。我又卡住了。我读了不少有类似问题的题目,但没有找到解决办法。我有一个分隔的csv文件,第8列($elements7)上的字符串如下:“aaaa;bb;cccc;and;eeee;fffff;gg;”。我正在尝试的是根据字符串拆分,并将输出捕获到变量。然后在它们自己的列中的主csv文件中使用这些变量。

所以现在这个文件就像:

3d;2f;7j;8k;4s;2b;5g;"aaaa;bb;cccc;ddddd;eeee;fffff;gg;";4g;1a;5g;2g;7h;3d;2f;7j 3c;9k;5l;4g;1a;5g;3d;"aaaa;bb;cccc;ddddd;eeee;fffff;gg;";4g;1a;5g;2g;7h;3d;2f;7j 4g;1a;5g;2g;7h;3d;8k;"aaaa;bb;cccc;ddddd;eeee;fffff;gg;";3d;2f;7j;8k;4s;2b;4g;1a

我想要的是:

3d;2f;7j;8k;4s;2b;5g;4g;1a;5g;2g;7h;3d;2f;7j;aaaa;bb;cccc;ddddd;eeee;fffff;gg 3c;9k;5l;4g;1a;5g;3d;4g;1a;5g;2g;7h;3d;2f;7j;aaaa;bb;cccc;ddddd;eeee;fffff;gg;4g;1a;5g;2g;7h;3d;8k;3d;2f;7j;8k;4s;2b;4g;1a;aaaa;bb;cccc;ddddd;eeee;fffff;gg;

这是我一直在尝试的代码。我知道..太可怕了!但我希望有人能帮我?

代码语言:javascript
运行
复制
use strict;
use warnings;

my $inputfile  = shift || die "Give files\n";
my $outputfile = shift || die "Give output\n";

open my $INFILE,  '<', $inputfile   or die "In use / Not found :$!\n";
open my $OUTFILE, '>', $outputfile  or die "In use :$!\n";

while (<$INFILE>) {
  s/"//g;
  my @elements = split /;/, $_;

    my ($varA, $varB, $varC, $varD, $varE, $varF, $varG, $varH) split (';', $elements[10]);
        $elements[16] = $varA;
        $elements[17] = $varB;
        $elements[18] = $varC;
        $elements[19] = $varD; 
        $elements[20] = $varE;
        $elements[21] = $varF;
        $elements[22] = $varG;
        $elements[23] = $varH;

my $output_line = join(";", @elements);
print $OUTFILE $output_line;
}

close $INFILE;
close $OUTFILE;

exit 0;

我对我的声明也很困惑,这不应该是可能的,对吧?我的意思是,$vars是一个封闭的部分,所以不可能将它们写到$elements中?

编辑

这就是我如何根据TLP的建议调整代码的方式:

代码语言:javascript
运行
复制
use strict;
use warnings;
use Text::CSV;

my $inputfile  = shift || die "Give files\n";
my $outputfile = shift || die "Give output\n";

open my $INFILE,  '<', $inputfile   or die "In use / Not found :$!\n";
open my $OUTFILE, '>', $outputfile  or die "In use :$!\n";

my $csv = Text::CSV->new({  # create a csv object
    sep_char => ";",    # delimiter
    eol => "\n",        # adds newline to print
});

while (my $row = $csv->getline($INFILE)) {      # $row is an array ref
my $line = splice(@$row, 10, 1);            # remove 8th line
$csv->parse($line);                         # parse the line
push @$row, $csv->fields();                 # push newly parsed fields onto       main array
$csv->print($OUTFILE, $row);
}

close $INFILE;
close $OUTFILE;

exit 0;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-05 12:44:49

您应该使用CSV模块,例如案文:CSV来解析数据。下面是一个简单的例子,说明如何做到这一点。您可以用您自己的文件句柄替换我下面使用的文件句柄。

代码语言:javascript
运行
复制
use strict;
use warnings;
use Text::CSV;

my $csv = Text::CSV->new({     # create a csv object
        sep_char => ";",   # delimiter
        eol => "\n",       # adds newline to print
    });

while (my $row = $csv->getline(*DATA)) {   # $row is an array ref
    my $line = splice(@$row, 7, 1);   # remove 8th line
    $csv->parse($line);               # parse the line
    push @$row, $csv->fields();       # push newly parsed fields onto main array
    $csv->print(*STDOUT, $row);
}

__DATA__
3d;2f;7j;8k;4s;2b;5g;"aaaa;bb;cccc;ddddd;eeee;fffff;gg;";4g;1a;5g;2g;7h;3d;2f;7j
3c;9k;5l;4g;1a;5g;3d;"aaaa;bb;cccc;ddddd;eeee;fffff;gg;";4g;1a;5g;2g;7h;3d;2f;7j
4g;1a;5g;2g;7h;3d;8k;"aaaa;bb;cccc;ddddd;eeee;fffff;gg;";3d;2f;7j;8k;4s;2b;4g;1a

输出:

代码语言:javascript
运行
复制
3d;2f;7j;8k;4s;2b;5g;4g;1a;5g;2g;7h;3d;2f;7j;aaaa;bb;cccc;ddddd;eeee;fffff;gg;
3c;9k;5l;4g;1a;5g;3d;4g;1a;5g;2g;7h;3d;2f;7j;aaaa;bb;cccc;ddddd;eeee;fffff;gg;
4g;1a;5g;2g;7h;3d;8k;3d;2f;7j;8k;4s;2b;4g;1a;aaaa;bb;cccc;ddddd;eeee;fffff;gg;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11344366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档