perl分裂8gb csv用“,”作为模式

时间:2016-03-19 20:54:54

标签: regex perl csv split

我知道这可能是重复的,但我必须拆分的文件大小需要一个方法,在处理之前不会将csv加载到内存中。即我正在寻找逐行方法来读取和拆分并输出我的文件。我只需要我的输出是最后3个字段,没有引号,没有千分隔逗号。

我有一个arcGIS坐标文件,其中包含字段内部的引号和逗号。下面的数据示例。

“0”, “0”, “1”, “1”, “1,058.83”, “1,455,503.936”, “5,173,996.331”

我一直在尝试使用split上的变体('“,”',$ line);来执行此操作。 这是我的代码。

use strict;
use warnings;

open (FH, '<', "DEM_Export.csv") or die "Can't open file DEM_Export.csv";

open (FH2, '>', "DEM_ExportProcessed.csv") or die "Can't open file DEM_ExportProcessed.csv"; 
print FH2 "EASTING, NORTHING, ELEVATION,\n";
my $count = 0;
foreach my $line (<FH>) {
    chomp;
    # if ($count == 0){next;}

    print $line, "\n";
    my @list = split( '","' , $line);
    print "1st print $list[5],$list[6],$list[4]\n";
    $list[4] =~ s/,//g;
    $list[5] =~ s/,//g;
    $list[6] =~ s/,//g;
    $list[4] =~ s/"//g;
    $list[5] =~ s/"//g;
    $list[6] =~ s/"//g;
    print "2nd print $list[5],$list[6],$list[4]\n";
    if ($count == 10) { 
        exit;
    }      
    my $string = sprintf("%.3f,%.3f,%.3f\n", $list[5],$list[6],$list[4]); 
    print FH2 $string;
    $count++;
}

close FH;
close FH2;

我正在接近我的智慧结束,真的需要一个解决方案。 我们将非常感激地提供任何帮助。 干杯

2 个答案:

答案 0 :(得分:4)

使用Text::CSV来处理CSV数据的肮脏感非常简单

这是一个示例,可以与您显示的示例数据一起使用。只要您的输入文件是纯ASCII并且行大小与您显示的大小相同,它就可以正常工作

它将其输出打印到STDOUT,因此您希望使用命令行重定向将其放入您想要的文件中

use strict;
use warnings 'all';

use Text::CSV;

my $csv_file = 'DEM_Export.csv';

open my $in_fh, '<', $csv_file or die qq{Unable to open "$csv_file" for input: $!};

my $csv = Text::CSV->new({ eol => "\n" });

print "EASTING,NORTHING,ELEVATION\n";

while ( my $row = $csv->getline($in_fh) ) {

   $csv->print(\*STDOUT, [ map tr/,//dr, @$row[-2,-1,-3] ] );
}

输出

1455503.936,5173996.331,1058.83

答案 1 :(得分:0)

我想我应该更勇敢,并且开始使用Text :: CSV而不是问一个问题。 非常感谢Сухой27和choroba指出我正确的方向。

这是我最终得到的代码。可能不是最整洁的。

use strict;
use warnings;
use Text::CSV;

my $file  = "DEM_Export.csv";
my $file2 = "DEM_ExportProcessed.csv";

open (FH2, '>', $file2) or die "Can't open file $file2: $!";
print FH2 "EASTING, NORTHING, ELEVATION,\n";
print "Starting file processing...\n";
my $csv = Text::CSV->new ({ binary => 1, eol => $/ });
open my $io, "<", $file or die "$file: $!";
while (my $row = $csv->getline ($io)) {
    my @fields = @$row;
    s/,//g for @fields[3..5];     
    my $string = sprintf("%.3f,%.3f,%.3f\n", $fields[4],$fields[5],$fields[3]); 
    print FH2 $string;
}
print "Finished!";
close FH2;  

工作了一顿! 谢谢。