- ベストアンサー
Excelのcsv形式の読み込みに関する問題と解決法
- Excelのcsv形式のデータを読み込んでいる際、未入力データ箇所があるために出力データがズレるという問題に遭遇しました。
- 解決法として正規表現を使用して半角スペースを挿入しようとしましたが、基データを直接操作することは望ましくないため、プログラムで処理する方法を探しています。
- 現在のプログラムでは、file.csvのデータを読み込んでout.csvに出力しています。出力する際に、行頭の"や行末の"を削除して、空データを半角スペースに置換しています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
grep { length } が空要素を削除しています。grep { length } の処理を行わずに、行の先頭の " と行末の ", を別の手段で削除すれば空要素もそのまま残るようになります。 sub readCsvFile { open(IN, $_[0]); my $line = ""; while(<IN>) { chomp; $line .= $_; next if $line !~ /end/; $line =~ s/^"//; $line =~ s/",$//; # この行を追加 push @csv, [ split(/","/, $line) ]; # "," のみに戻す $line = ""; } close(IN); }
その他の回答 (4)
- ralf124c
- ベストアンサー率52% (232/446)
流儀が違うのでご参考になるかわかりませんが、たぶん期待した結果が得られると思うものを作ってみました。 -------------------------------------- #!/usr/local/bin/perl open(WR_DATA,">out.csv"); open(RD_DATA, "file.csv"); while(my $line = <RD_DATA>){ $line .= <RD_DATA> while ($line =~ tr/"// % 2 and !eof(RD_DATA)); $line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/; $line =~ s/\r\n|\r|\n//g; my @csv = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_} ($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g); if($csv[0] eq ""){ $csv[0] = " "; } if($csv[1] eq ""){ $csv[1] = " "; } if($csv[3] eq ""){ $csv[3] = " "; } my $sTmp = sprintf("%s,%s,%s,%s,%s,\n",$csv[1],$csv[2],$csv[3],$csv[0],$csv[4]); print WR_DATA $sTmp; } close(RD_DATA); close(WR_DATA); exit;
お礼
ralf124cさま、2回目の回答ありがとうございます。 ANo.3の回答を入れてプログラムを書いていただき とても参考になりました。 こんな書き方があったのかと驚きました。 本当にありがとうございました。
- tsuduki123
- ベストアンサー率32% (21/65)
最近は閑古鳥が泣いている某サイトに昔ちょうどいい感じのお題が出ていました。 perlの投稿は2件。 べた書きされている方は、戻り読みとかすればもう少しスマートになりそうだけど 紹介しておきます。 Text::CSV_XSは日本語の扱いに問題があるって聞いたことあるけど 今はもう直っているのかな?
- 参考URL:
- http://ja.doukaku.org/33/
お礼
こんなサイトがあったのですね! 参考にさせていただきました。 Text::CSV_XSを使用しようか悩みましたが、 問題があるとあちこちで書かれていたため結局やめました… ありがとうございました。
- ralf124c
- ベストアンサー率52% (232/446)
根本部分は他の方がご指摘されておりますのであと $csv[$i][0] =~ s// /; #空データを半角スペースに置換 これだと、中身がなんでも先頭に必ずスペースが入ってしまう。 まわりくどいけど if($csv[$i][0] eq ''){ $csv[$i][0] = ' '; } こんな感じでいいんじゃないでしょうか。
お礼
細かなところまで指摘していただいてありがとうございました。 お陰でかなりスッキリしました!
- Tacosan
- ベストアンサー率23% (3656/15482)
split で一気に処理しようなどと思わず, ちょっとずつやっていけばいいのでは?
お礼
回答ありがとうございました。 ちょっとずつやるやり方も分らなかったので質問をしました。
お礼
回答ありがとうございました。 無事に解決できました! 本当にありがとうございました!