我正在尝试根据列值将一个大文件(大约有 1760 万个数据)拆分为 6-7 个小文件。目前,我正在使用 sql bcp 实用程序将所有数据转储到一个表中,并使用 bcp 创建单独的文件出效用。
但是有人建议我使用 Perl,因为它会更快,而且您不需要为此创建表。因为我不是 perl 人。我不知道如何在 perl 中做到这一点。任何帮助..
输入文件 :
输入文件.txt
0010|name|address|city|.........
0020|name|number|address|......
0030|phone no|state|street|...
Run Code Online (Sandbox Code Playgroud)
输出文件:
0010.txt
0010|name|address|city|.........
Run Code Online (Sandbox Code Playgroud)
0020.txt
0020|name|number|address|......
Run Code Online (Sandbox Code Playgroud)
0030.txt
0030|phone no|state|street|...
Run Code Online (Sandbox Code Playgroud)
保持输出文件句柄的散列是最简单的,以文件名为键。这个程序展示了这个想法。每条记录开头的数字用于创建它所属文件的名称,除非我们已经有文件句柄,否则打开该名称的文件。
处理完所有数据后,将关闭所有句柄。任何错误都被抓住了use autodie
,对这么露骨的检查open
,print
并close
调用是不必要的。
use strict;
use warnings;
use autodie;
open my $in_fh, '<', 'inputfile.txt';
my %out_fh;
while (<$in_fh>) {
next unless /^(\d+)/;
my $filename = "$1.txt";
open $out_fh{$filename}, '>', $filename unless $out_fh{$filename};
print { $out_fh{$filename} } $_;
}
close $_ for values %out_fh;
Run Code Online (Sandbox Code Playgroud)
Note close
抓住了我,因为与大多数$_
不传递参数的操作符不同,bareclose
将关闭当前选定的文件句柄。这是一个糟糕的选择 IMO,但现在改变它已经晚了