プロが教える店舗&オフィスのセキュリティ対策術

perlの勉強を始めたばかりの者です。
perlでcsv(約5000行)を読み込み、それを出力させたいのですが、以下のプログラムで実行してみるとcsvの最後の行しか出力してくれません。一行ずつすべての行を出力したいのですが...画像のcsvはエクセル(Mac)で開いています。

#!/usr/bin/perl

$inputfile="aaa.csv";

open (FILE, $inputfile) or die "ありません";
while (<FILE>) {
print $_;
}
close (FILE);

よろしくお願いします

「perlでcsvの出力について」の質問画像

A 回答 (1件)

その確認って、具体的にどうやってやりましたか?


実行したときの画面表示だけだとしたら

 aaa.csvの改行コードが CR になっている
 端末では、通常、CR は「行頭にカーソルを移動する」だけで改行しない
 そのため、画面上が後から出力したものに上書きされたように見える
 → 画面上には、最後の行だけしか出力されてないように見える

ということが考えられます。
・ターミナルで file コマンドを使って file aaa.csv として、改行コードについての情報を得る(表示されないこともある)
・ターミナルで od コマンドを使って od -c aaa.csv でファイルのダンプが出力される。このとき、改行コードは \r とか \n とか表示されるので、それがどうなっているかを確認する。
・nkf をインストールしてあるなら、 nkf --guess で改行コードを調べる。

などで、 aaa.csv の改行コードを確認してください。


また、 CR だったとすると別の問題があります
 <FILE> は 改行文字を含めた1行を読み込みます。
 現行のMacはUNIX系OSが採用されており、標準の改行コードは LF です。
 よって、 CR は「ただの文字」として扱われるので、1行ずつ読むつもりで全部を一気に読みこんでしまいます。

1行ずつ読み込むには
・LF で保存する
・openの3引数版を使って、改行コードを指定する
・特殊変数で設定を変える
http://perldoc.jp/docs/perl/5.20.1/perlvar.pod#S …
> IO::Handle->input_record_separator( EXPR )
> $INPUT_RECORD_SEPARATOR
> $RS
> $/
> 入力レコードセパレータで、デフォルトでは改行文字。 これは Perl での「行」とは何か、ということに影響を与えます。
等が必要です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!