Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the wordpress-seo domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /var/www/vinascript/html/wp-includes/functions.php on line 6114
[Perl] Hướng dẫn đọc và ghi file CSV trong Perl 5 - VinaScript

Latest Post

Triển khai dự án PHP, Mysql với Nginx trên Docker Tìm hiểu về HTML – Ưu điểm, nhược điểm và cách hoạt động của HTML

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

Để lại một bình luậ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 *