首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据perl中的列值将大文件拆分成小文件

根据perl中的列值将大文件拆分成小文件
EN

Stack Overflow用户
提问于 2014-04-30 00:41:00
回答 4查看 926关注 0票数 1

我试图根据列value.Currently将一个大文件(大约有1,760万个数据)分成6-7个小文件,我使用sql bcp实用程序将所有数据转储到一个表中,并使用bcp out实用程序创建单独的文件。

但是有人建议我使用Perl,因为它会更快,而且你不需要为that.As创建表,我不喜欢perl。我不确定如何在perl中做到这一点。任何帮助..。

输入文件:

inputfile.txt

代码语言:javascript
复制
0010|name|address|city|.........
0020|name|number|address|......
0030|phone no|state|street|...

输出文件:

0010.txt

代码语言:javascript
复制
0010|name|address|city|.........

0020.txt

代码语言:javascript
复制
0020|name|number|address|......

0030.txt

代码语言:javascript
复制
0030|phone no|state|street|...
EN

回答 4

Stack Overflow用户

发布于 2014-04-30 01:00:44

最简单的方法是保留输出文件句柄的散列,以文件名为关键字。这个程序展示了这个想法。每条记录开头的数字用于创建它所属的文件的名称,除非我们已经有一个文件句柄,否则该名称的文件将被打开。

一旦处理完所有数据,所有句柄都将关闭。任何错误都会被use autodie捕获,因此不需要对openprintclose调用进行显式检查。

代码语言:javascript
复制
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;

注意到 close在这里抓住了我,因为与大多数在$_上工作的操作符不同,如果你不传递参数,一个空的close将关闭当前选择的文件句柄。这是一个糟糕的选择,但现在改变它已经为时已晚

票数 5
EN

Stack Overflow用户

发布于 2014-04-30 00:48:01

我想,1760万行将是一个相当大的文件。使用perl处理仍然会很慢。

也就是说,您将需要类似于以下内容:

代码语言:javascript
复制
use strict;
use warnings;

my $input = 'FILENAMEHERE.txt';
my %results;

open(my $fh, '<', $input) or die "cannot open input file: $!";
while (<$fh>) {
  my ($key) = split '|', $_;
  my $array = $results{$key} || [];
  push $array, $_;
  $results{$key} = $array;
}

for my $filename (keys %results) {
  open(my $out, '>', "$filename.txt") or die "Cannot open output file $out: $!";
  print $out, join "\n", $results{$filename};
  close($out);
}

我还没有明确地测试这一点,但它应该会让您朝着正确的方向前进。

票数 1
EN

Stack Overflow用户

发布于 2014-04-30 00:48:52

代码语言:javascript
复制
$ perl -F'|' -lane '
    $key = $F[0];
    $fh{$key} or open $fh{$key}, ">", "$key.txt" or die $!;
    print { $fh{$key} } $_
  ' inputfile.txt
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23370499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档