Làm thế nào để đọc và ghi dữ liệu từ và ra file CSV bằng Perl 5? Bài viết này sẽ hướng dẫn cách thực hiện các thao tác này bằng ngôn ngữ lập trình Perl 5.
Hiểu về định dạng file CSV
CSV, hay còn gọi là “Comma Separated Values,” là một loại định dạng văn bản cơ bản trong đó các giá trị được phân tách bằng dấu phẩy.
Ví dụ:
Đọc file CSV sử dụng Perl 5
Đọc và parse file CSV đơn giản
Một đoạn source code đơn giản sử dụng Perl 5 để đọc file CSV
#!/usr/bin/perl # vinasupport.com use strict; use warnings; use Data::Dumper; my $csvFile = 'data/anything.csv'; my @csvData; open(my $fh, '<', $csvFile) or die "Can't read file '$csvFile'. Error: [$!]n"; # About the fastest you'll get for pure-Perl is to read the file line by line and then naively split the data: while (my $line = <$fh>) { chomp $line; my @fields = split(/,/, $line); # This will fail if any fields contain embedded commas. A more robust (but slower) approach would be to use Text::ParseWords. To do that, replace the split with this: # my @fields = Text::ParseWords::parse_line(',', 0, $line); push @csvData, @fields; } print Dumper @csvData;
Đọc và parse file CSV có header
Đoạn source code đọc file với dòng đầu tiên trong CSV là danh sách tên các trường dữ liệu như ví dụ ở trên.
#!/usr/bin/perl # vinasupport.com use strict; use warnings; use Data::Dumper; my $csvFile = 'data/anything.csv'; my @csvData; open(my $fh, '<', $csvFile) or die "Can't read file '$csvFile'. Error: [$!]n"; # About the fastest you'll get for pure-Perl is to read the file line by line and then naively split the data: my @header; my $i = 1; while (my $line = <$fh>) { chomp $line; # This will fail if any fields contain embedded commas. A more robust (but slower) approach would be to use Text::ParseWords. To do that, replace the split with this: # my @fields = Text::ParseWords::parse_line(',', 0, $line); my @fields = split(/,/, $line); # Row 1 is header if ($i == 1) { @header = @fields; } else { my %row; foreach my $key (keys @header) { $row{$header[$key]} = $fields[$key]; } push @csvData, %row; } $i++; } # print data foreach my $data (@csvData) { print Dumper @{$data}{'name','age'}; }
Đọc và parse file CSV sử dụng thư viện
Sử dụng thư viện hỗ trợ việc đọc và ghi CSV là Text::CSV, để cài đặt thư viện này qua cpan sử dụng command sau:
cpan Text::CSV
Đoạn code đọc CSV thông qua thư viện Text::CSV
#!/usr/bin/perl # vinasupport.com use strict; use warnings; use Data::Dumper; use Text::CSV; my $csv = Text::CSV->new({ sep_char => ',' }); my $csvFile = 'data/anything.csv'; my @csvData; my @header; my $i = 1; open(my $data, '<', $csvFile) or die "Could not open '$csvFile' $!n"; while (my $line = <$data>) { chomp $line; if ($csv->parse($line)) { my @fields = $csv->fields(); # Row 1 is header if ($i == 1) { @header = @fields; } else { my %row; foreach my $key (keys @header) { $row{$header[$key]} = $fields[$key]; } push @csvData, %row; } } else { warn "Line could not be parsed: $linen"; } $i++; } # print data foreach my $data (@csvData) { print Dumper @{$data}{'name','age'}; }
Ghi file CSV sử dụng Perl 5
Một ví dụ về sử dụng thư viện Text::CSV_XS để ghi dữ liệu ra file CSV
#!/usr/bin/perl # vinasupport.com use warnings; use strict; use Text::CSV_XS; my $csv = Text::CSV->new ( { binary => 1, eol => "n" } ) or die "Cannot use CSV: " . Text::CSV->error_diag(); my $file = 'output.csv'; open my $fh_out , '>', 'output.csv' or die "Can't open $file for writing: $!"; my @headers = qw( COL_NAME1 COL_NAME2 COL_NAME3 COL_NAME4 ); my @data = 1..4; $csv->print($fh_out, @headers); $csv->print($fh_out, @data); close $fh_out;
Kết quả ta có file CSV output.csv với dữ liệu như bên dưới:
COL_NAME1,COL_NAME2,COL_NAME3,COL_NAME4 1,2,3,4