建议使用模块在文件中写入

时间:2014-08-22 08:54:54

标签: perl

我需要编写一个包含多个列的文件,并且行数以十亿为单位。我不知道是否遵循行方法或列方法。每列将包含不同的值。

我之前尝试使用Tie:File模块,但速度非常慢并且内存不足。请提出一些想法。

我的输出文件数据如下:

001|jhon|12, avenue street|234221|newyork
002|sam|broad street|535251|berlin
003|raju|15/a, street|4234614|jersy

列数和行大小可能会有所不同!

1 个答案:

答案 0 :(得分:1)

看看你的数据是什么样子会有所帮助,但请记住,没有"列"在文本文件中,除非由读取它的软件定义。您可能需要CSV(逗号分隔值)文件,在这种情况下,如果可以保证数据不包含逗号或双引号,则可以使用join运算符。或者您可能需要Text::CSV模块,这将使您的数据具有任何复杂性。

以下是几个例子:

使用join

use strict;
use warnings;
use 5.010;
use autodie;

my @data = (
  [qw/ 1 2 3 /],
  [qw/ A B C /],
  [qw/ a b c/],
);

open my $fh, '>', 'mycsv1.csv';

for my $row (@data) {
  print $fh join(',', @$row), "\n";
}

close $fh;

<强>输出

1,2,3
A,B,C
a,b,c

使用Text::CSV

use strict;
use warnings;
use 5.010;
use autodie;

use Text::CSV;

my @data = (
  [ 'data1', 'data2', 'data3' ],
  [ '"data1"', 'data "with quotes" 2', 'data "3"' ],
  [ 'data,1', 'data, with commas, 2', 'data, number 3' ],
  [ '"data","1"', 'data, with "quotes" and "commas", 2', 'data, "number 3"' ],
);

my $csv = Text::CSV->new({ eol => $/ });
open my $fh, '>', 'mycsv2.csv';

for my $row (@data) {
  $csv->print($fh, $row);
}

close $fh;

<强>输出

data1,data2,data3
"""data1""","data ""with quotes"" 2","data ""3"""
"data,1","data, with commas, 2","data, number 3"
"""data"",""1""","data, with ""quotes"" and ""commas"", 2","data, ""number 3"""