我无法计算记录的数量,并删除单个记录之间存在的新线字符,并将此文件输出附加到另一个代码。CSV文件看起来像
RandomName,FileName,Date,OwnerName
"f","df",10/12/1298,"dgds"
-13,"fg
dhd
fd
f",10/22/1029,"dvg
tr
-456
3gf"
"123","fd13",13/23/1245,"13
sdg
fsdg"
dv,"Df",12/12/3455,"adf"
预期输出
RandomName,FileName,Date,OwnerName
"f","df",10/12/1298,"dgds"
-13,"fgdhdfdf",10/22/1029,"dvgtr-4563gf"
"123","fd13",13/23/1245,"13sdgfsdg"
dv,"Df",12/12/3455,"adf"
该文件的大小为132GB。我使用此解决方案 -
perl -0777 -pe 's/((?:,"|(?!^)G)[^",n]*)n/1/g; s/,n/,/' "${dir}" | wc -l
但它投掷内核软锁定错误。我的服务器中有Shell/Awk/Perl。我的文件可以包含 -
- 任何数量的记录
- size< = 132 GB
- 文件可以包含特殊字符。($,@,@,*, - ,_,%(
- 新的线字符可以在单个记录中多次发生。
请帮助我找到将输出打印到控制台和另一个CSV文件的解决方案。预先感谢。
您只需要使用 Text::CSV_XS
模块启用了binary
选项。这将允许引用的字段包含包括CR和LF在内的控制字符。_XS
后缀表示该模块具有很大的C组件,因此将提供一个解决方案,该解决方案是最佳可用的,而无需在C
此程序期望输入文件作为命令行上的参数
您对您想要的输出没有任何说法,所以我已经使用了 Data::Dump
模块要显示使用Text::CSV_XS
解析示例数据的每一行的结果
use strict;
use warnings 'all';
use Data::Dump 'pp';
use Text::CSV_XS;
my ( $csv_file ) = @ARGV or die "CSV File parameter missing";
open my $fh, '<', $csv_file or die qq{Unable to open "$csv_file" for input: $!};
my $csv = Text::CSV->new( {
binary => 1,
} );
my $num_records = 0;
while ( my $row = $csv->getline( $fh ) ) {
print pp($row), "nn";
++$num_records;
}
printf "Total of %d %snn",
$num_records,
$num_records == 1 ? 'record' : 'records';
输出
["RandomName", "FileName", "Date", "OwnerName"]
["f", "df", "10/12/1298", "dgds"]
[-13, "fgndhdnfdnf", "10/22/1029", "dvg ntrn-456n3gf"]
[123, "fd13", "13/23/1245", "13nsdgnfsdg"]
["dv", "Df", "12/12/3455", "adf"]
Total of 5 records