计数记录数,并使用Shell/Awk/Perl在CSV文件(大小接近132 GB)中的记录之间删除新的行字符



我无法计算记录的数量,并删除单个记录之间存在的新线字符,并将此文件输出附加到另一个代码。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。我的文件可以包含 -

  1. 任何数量的记录
  2. size< = 132 GB
  3. 文件可以包含特殊字符。($,@,@,*, - ,_,%(
  4. 新的线字符可以在单个记录中多次发生。

请帮助我找到将输出打印到控制台和另一个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

最新更新