我知道这可能是重复的,但我必须拆分的文件大小需要一个方法,在处理之前不会将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;
我正在接近我的智慧结束,真的需要一个解决方案。 我们将非常感激地提供任何帮助。 干杯
答案 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;
工作了一顿! 谢谢。