[Perl] Hướng dẫn đọc và ghi file CSV trong Perl 5


Làm thế nào để để đọc và ghi dữ liệu ra file CSV trong Perl 5? Bài viết này sẽ cung cấp cho các bạn các phương thức thao tác với file CSV sử dụng ngôn ngữ lập trình Perl 5.

Hiểu về định dạng file CSV

CSV là gì?  CSV (Comma Separated Values) là một loại định dạng văn bản đơn giản mà trong đó, các giá trị được ngăn cách với nhau 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: $line\n";
    }
    $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

 

Nguồn: vinasupport.com

             
SHARE

mode_edit Bình luận của bạn

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

account_circle
web