Perl:Join/Splits-未初始化变量
我试图在从CSV文件读取的行的开始和结束处添加引号,然后将其拆分并添加到数组中Perl:Join/Splits-未初始化变量,perl,Perl,我试图在从CSV文件读取的行的开始和结束处添加引号,然后将其拆分并添加到数组中 a,b,c<br /> x,y,z<br /> 我的数据看起来像我的数据看起来像: a,b,c<br /> x,y,z<br /> 我试图找出如何解决这个问题,我认为(对某人而言)这将是我所缺少的一些简单的东西 额外信息 我知道如果我想在开始和结束时添加引号,我会使用: push (@lines, "\""); unshift (@lines, "\"");
a,b,c<br /> x,y,z<br />
我的数据看起来像我的数据看起来像:
a,b,c<br /> x,y,z<br />
我试图找出如何解决这个问题,我认为(对某人而言)这将是我所缺少的一些简单的东西
额外信息
我知道如果我想在开始和结束时添加引号,我会使用:
push (@lines, "\"");
unshift (@lines, "\"");
my $newStr = join $/, @lines;
print $newStr;
完整代码为:
use warnings;
use Text::CSV;
use Data::Dumper;
use constant debug => 0;
use Text::CSV;
print "Running CSV editor......\n";
#my $csv = Text::CSV->new({ sep_char => ',' });
my $file = $ARGV[0] or die "Need to get CSV file on the command line\n";
my $fileextension = substr($file, -4);
#If the file is a CSV file then read in the file.
if ($fileextension =~ m/csv/i) {
print "Reading and formating: $ARGV[0] \n";
open(my $data, '<', $file) or die "Could not open '$file' $!\n";
my @fields;
while (my $line = <$data>) {
#Clears the white space at the end of the line.
chomp $line;
#Splits the line up and removes the <br />.
my @lines = join("\"", split (qr{<br\s?/>})), $line;
#Removes the control character.
shift (@lines);
print "\n";
#print $_, $/ for @lines;
}
print "\n Finished reading and formating: $ARGV[0] \n";
}
else {
print "Error: File is not a CSV file\n"
}
使用警告;
使用Text::CSV;
使用数据::转储程序;
使用常量debug=>0;
使用Text::CSV;
打印“正在运行CSV编辑器…”\n;
#我的$csv=Text::csv->new({sep_char=>','});
my$file=$ARGV[0]或die“需要在命令行上获取CSV文件\n”;
my$fileextension=substr($file,-4);
#如果文件是CSV文件,则读取该文件。
如果($fileextension=~m/csv/i){
打印“读取和格式化:$ARGV[0]\n”;
打开(我的$data),首先:请在所有程序中始终
其中一个闭合支架位于错误的位置
my @lines = join("\"", split (qr{<br\s?/>})), $line;
^-- The second arg of split goes here.
改用这个:
my @lines = join('"', split(qr{<br\s?/>}, $line));
例如:
my $line = 'a<br/>b<br/>c';
my @lines = join "\"", split qr{<br\s?/>}, $line;
print Dumper \@lines;
还要注意的是,获取列表并返回单个字符串,而不是数组。首先:请在所有程序中始终
其中一个闭合支架位于错误的位置
my @lines = join("\"", split (qr{<br\s?/>})), $line;
^-- The second arg of split goes here.
改用这个:
my @lines = join('"', split(qr{<br\s?/>}, $line));
例如:
my $line = 'a<br/>b<br/>c';
my @lines = join "\"", split qr{<br\s?/>}, $line;
print Dumper \@lines;
还要注意的是,它获取一个列表并返回一个字符串,而不是一个数组。我想知道您的数据是否真的看起来像这样
<br/>a,b,c<br/>x,y,z
a,b,c
x,y,z
在这种情况下,你需要的是
my @lines = split m|<br\s*/>|, $line;
print qq("$_"\n) for grep /\S/, @lines;
my@lines=splitm | |,$line;
为grep/\S/,@行打印qq($\n);
但是你的信息不一致,我只是在这里猜测,我想知道你的数据是否真的像这样
<br/>a,b,c<br/>x,y,z
a,b,c
x,y,z
在这种情况下,你需要的是
my @lines = split m|<br\s*/>|, $line;
print qq("$_"\n) for grep /\S/, @lines;
my@lines=splitm | |,$line;
为grep/\S/,@行打印qq($\n);
但是您的信息不一致,我只是在这里猜测是的,也就是说。split
作为默认参数$\uuu
。您需要指定正确的行,您希望通过split
函数拆分它。我将在您的情况下执行此操作:split/delimiter/,$splitThisLine
请查看一些实际的输入数据ata和您想要的相应输出?您没有显示任何包含
的内容。我认为您混淆了Perl和C,因为您似乎认为可以通过数组访问字符串的字符。现在发生的是,您正在创建一个数组@lines
,其中一个元素等于返回值ofjoin
。您可以通过调用shift
立即删除此元素,并使用注释删除控制字符,因此数组最终为空。我添加了一个数据示例,当然是狗屎(@lines)删除数组中的第一个元素,在我的例子中,它是一个控制字符。是的,也就是说。split
将作为默认参数$\uu
。您需要指定正确的行,您希望通过split
函数拆分该行。我将在您的例子中执行此操作:split/delimiter/,$splitThisLine
请查看一些相关信息l输入数据和所需的相应输出?您没有显示任何包含
的内容。我认为您将Perl与C混淆了,因为您似乎认为可以通过数组访问字符串的字符。所发生的是,您正在创建一个数组@lines
,其中单个元素等于return值join
。您可以通过调用shift
立即删除此元素,并使用注释删除控制字符,因此数组最终为空。我添加了一个数据示例,当然是狗屎(@lines)删除数组中的第一个元素,在我的例子中它是一个控制字符。我的数据看起来像:a,b,c
x,y,z
+1我也在想同样的事情。整个join'““
部分非常奇怪……但是我没有时间了,所以我没有在我的回答中跟进。我的数据看起来像:a,b,c
x,y,z
+1我也在想同样的事情。整个连接”
部分非常奇怪……但是我没有时间了,所以我没有在我的回答中跟进。
my @lines = split m|<br\s*/>|, $line;
print qq("$_"\n) for grep /\S/, @lines;