Excelのcsv形式の読み込み
Excelのcsv形式の読み込み
前回、http://okwave.jp/qa/q6018540.htmlで
質問させていただきましたJurassic_periodです。
お力を貸していただきました方々本当にありがとうございました。
今回ですが同じプログラムでまた壁にぶつかってしまいました。
どうかよろしくお願いいたします。
Excelのcsv形式の「file.csv」のようなデータを読み込んでいます。
「out.csv」のように出力したいのですが
未入力「""」のデータ箇所が多々ある事に気が付きました。
次データを読み込むため出力データがズレてしまい困っています。
「file.csv」
"2010/1/1","C","こんにちは","田中","end",
"2009/10/2","B","おはよう","","end",
"2007/3/20","E","Good mor
ning","佐藤","end",
"1988/8/16","","こんばんは","中
村","end",
"","A","Hello","木村","end",
"2005/9/17","D","おはようご
ざいます","斎藤","end",
「out.csv」(このように出力したいです)
C,こんにちは,田中,2010/1/1,end,
B,おはよう, ,2009/10/2,end,
E,Good morning,佐藤,2007/3/20,end,
,こんばんは,中村,1988/8/16,end,
A,Hello,木村, ,end,
D,おはようございます,斎藤,2005/9/17,end,
解決法として、正規表現を用いて「半角スペース」を入れようとしました。
また、直接「file.csv」の「,"",」を置換で「," ",」にしましたが
基データを操作するのは好ましくないのでプログラムで
どうにか処理ができないでしょうか。
「今書いているプログラムです」
#!/usr/local/bin/perl
use strict;
use Fatal qw/ open /;
my $csv_file = "file.csv";
my @csv;
&readCsvFile($csv_file);
open(OUT,">out.csv");
for(my $i=0; $i<=$#csv; $i++){
$csv[$i][0] =~ s/"//; #行頭の"を削除
$csv[$i][4] =~ s/"//; #行末の"を削除
$csv[$i][0] =~ s// /; #空データを半角スペースに置換
$csv[$i][1] =~ s// /;
$csv[$i][3] =~ s// /;
print OUT $csv[$i][1],",";
print OUT $csv[$i][2],",";
print OUT $csv[$i][3],",";
print OUT $csv[$i][0],",";
print OUT $csv[$i][4],",\n";
}
close(OUT);
sub readCsvFile {
open(IN, $_[0]);
my $line = "";
while(<IN>) {
chomp;
$line .= $_;
next if $line !~ /end/;
push @csv, [ grep { length } split(/","|",|"/, $line) ];
$line = "";
}
close(IN);
}
どうか、よろしくお願いいたします。
お礼
leaz024さん回答どうもありがとうございました。 leaz024さんの回答を参考にして何とか解決することができました。 確かに言われてみれば、という奴でした^^; 具体的には、 > $line =~ s/\n$/\"/g; という感じで最後の改行コードを置換するようにしました。 本当にどうもありがとうございました。