我有一个长单行的文本文件,需要将其拆分为多行,然后才能打印到CSV文件。我尝试了多种方法,但我非常接近,但是我的数据输出不正确。我坚持将字符串拆分为数组。
我已经尝试了下面的代码,尽管它正确地分割了行,但数据没有被分割成数组。
open (INPUT, '<', $proxy_file ) or die "Cannot open proxy file\n";
open(OUTPUT, '>', $complete) or die "Cannot create $complete.'\n'";
while(my $line = <INPUT>){
chomp $line;
$line =~ s/,//g;
$line =~ s/://g;
my @fields = split /(?<=\.com)/, $line;
print OUTPUT $_, "\n" for @fields;
这是示例数据
JACOB2345@gmail.com:YdjfkoweU, LUKE453@gmail.com:YdjfkoweU, WESLEY233@gmail.com:YdjfkoweU, Bruce2423@gmail.com:YdjfkoweU, Angel@gmail.com:YdjfkoweU, Lukder@gmail.com:YdjfkoweU,
我想将其拆分为:
FIELD 1 FIELD2
JACOB2345@gmail.com YdjfkoweU
LUKE453@gmail.com YdjfkoweU
等
答案 0 :(得分:2)
此代码将为您提供一个制表符,分隔CSV:
n,m,p=map(int,input().split())
答案 1 :(得分:1)
use strict;
use warnings;
while(my $line = <DATA>) {
chomp($line);
my @rows = split/,\s{1}/, $line;
foreach my $row (@rows) {
my ($field_1, $filed_2) = split/:/, $row;
print "$field_1<=>$filed_2\n";
}
}
__DATA__
JACOB2345@gmail.com:YdjfkoweU, LUKE453@gmail.com:YdjfkoweU, WESLEY233@gmail.com:YdjfkoweU, Bruce2423@gmail.com:YdjfkoweU, Angel@gmail.com:YdjfkoweU, Lukder@gmail.com:YdjfkoweU,
答案 2 :(得分:0)
尝试使用此简单的perl单线纸(好吧,几乎是单线纸):
echo 'JACOB2345@gmail.com:YdjfkoweU, LUKE453@gmail.com:YdjfkoweU, WESLEY233@gmail.com:YdjfkoweU, Bruce2423@gmail.com:YdjfkoweU, Angel@gmail.com:YdjfkoweU, Lukder@gmail.com:YdjfkoweU, ' | \
perl -F'/,\s*/' -lane '
BEGIN {
$out_rec_sep = "\t";
print join $out_rec_sep, map { "FIELD$_" } (1..2);
}
foreach $rec ( @F ) {
print join $out_rec_sep, split m{:}, $rec;
}'
打印到STDOUT(您可以使用> out_file
将其重定向到文件):
FIELD1 FIELD2
JACOB2345@gmail.com YdjfkoweU
LUKE453@gmail.com YdjfkoweU
WESLEY233@gmail.com YdjfkoweU
Bruce2423@gmail.com YdjfkoweU
Angel@gmail.com YdjfkoweU
Lukder@gmail.com YdjfkoweU
如果您需要csv(逗号分隔)而不是tsv(制表符分隔)输出,请更改为$out_rec_sep = ",";
。
您的代码存在一些问题。
输入用,
分隔,然后在每个记录中用:
分隔。在这种情况下,将split
与这些显而易见的通用定界符一起使用几乎总是容易的。首先将输入拆分为记录,然后将每个记录拆分为字段。这是一个非常常见的编程习惯。
您使用正则表达式删除定界符,然后在.com
上进行拆分的方法会导致代码变得更长,更模糊(摆脱输入的2个定界符结构),容易出错(如您所述) ),并且对输入的更改不可靠(请考虑某些电子邮件是否以.edu
,.org
等结尾)。