我需要编写一个包含多个列的文件,并且行数以十亿为单位。我不知道是否遵循行方法或列方法。每列将包含不同的值。
我之前尝试使用Tie:File
模块,但速度非常慢并且内存不足。请提出一些想法。
我的输出文件数据如下:
001|jhon|12, avenue street|234221|newyork
002|sam|broad street|535251|berlin
003|raju|15/a, street|4234614|jersy
列数和行大小可能会有所不同!
答案 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"""