概要

  • CSV(TSV)を読み込んで、ヘッダ行をキーにしたハッシュの配列を作成する。
  • ファイルの文字コードは UTF-8。
  • { binary => 1 } がデフォルトで指定されるように変更。(2012/02/28)
  • 戻り値が配列のリファレンスであることを確認してからデリファレンスするようにした。(2012/02/28)

ソース

readCSV.pl

#!/usr/bin/perl
# CSV(TSV)を読み込んで、ヘッダ行をキーにしたハッシュの配列を作成する。

use strict;
use warnings;
use utf8;
use Encode;
use Text::xSV::Slurp qw( xsv_slurp );
use YAML::Syck;

$YAML::Syck::ImplicitUnicode = 1;

my $charsetConsole	= 'CP932';
#my $charsetConsole	= 'UTF-8';
my $charsetFile		= 'UTF-8';

binmode( STDIN,  ":encoding($charsetConsole)" );
binmode( STDOUT, ":encoding($charsetConsole)" );
binmode( STDERR, ":encoding($charsetConsole)" );

my $filename = 'データ.txt';
my $csvoption = { sep_char => "\t" };

my @csv = readXSV( $filename, $csvoption );
print Dump( \@csv ) . "\n" ;

sub readXSV
{
	my( $fname, $opt ) = @_;
	$opt = { binary => 1, %{$opt} };
	open( my $fhin, "<:encoding($charsetFile)", encode( $charsetConsole, $fname ) )
		or die( "$fname: $!" );
	my @body = <$fhin>;
	close( $fhin );
	my $ret = xsv_slurp( 
		string => join( "", @body ), 
		text_csv => $opt, 
	);
	return ( ref( $ret ) eq 'ARRAY' ) 
		? @{ $ret } 
		: $ret ;
}

# EOF

入力

ID Name Gender DOB Comment
1 芳佳 2 1930/08/18 九字兼定
2 美緒 2 1925/08/26 ドーベルマン
3 ミーナ 2 1926/03/11 灰色狼

出力

--- 
- 
  Comment: 九字兼定
  DOB: 1930/08/18
  Gender: 2
  ID: 1
  Name: 芳佳
- 
  Comment: ドーベルマン
  DOB: 1925/08/26
  Gender: 2
  ID: 2
  Name: 美緒
- 
  Comment: 灰色狼
  DOB: 1926/03/11
  Gender: 2
  ID: 3
  Name: ミーナ

リンク