将一行长行从文本文件拆分为多行(CSV)

时间:2019-10-26 06:14:25

标签: regex csv perl split

我有一个长单行的文本文件,需要将其拆分为多行,然后才能打印到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

3 个答案:

答案 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等结尾)。