• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excelのcsv形式の読み込み)

Excelのcsv形式の読み込みに関する問題と解決法

このQ&Aのポイント
  • Excelのcsv形式のデータを読み込んでいる際、未入力データ箇所があるために出力データがズレるという問題に遭遇しました。
  • 解決法として正規表現を使用して半角スペースを挿入しようとしましたが、基データを直接操作することは望ましくないため、プログラムで処理する方法を探しています。
  • 現在のプログラムでは、file.csvのデータを読み込んでout.csvに出力しています。出力する際に、行頭の"や行末の"を削除して、空データを半角スペースに置換しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

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); }

Jurassic_period
質問者

お礼

回答ありがとうございました。 無事に解決できました! 本当にありがとうございました!

その他の回答 (4)

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.5

流儀が違うのでご参考になるかわかりませんが、たぶん期待した結果が得られると思うものを作ってみました。 -------------------------------------- #!/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;

Jurassic_period
質問者

お礼

ralf124cさま、2回目の回答ありがとうございます。 ANo.3の回答を入れてプログラムを書いていただき とても参考になりました。 こんな書き方があったのかと驚きました。 本当にありがとうございました。

回答No.4

最近は閑古鳥が泣いている某サイトに昔ちょうどいい感じのお題が出ていました。 perlの投稿は2件。 べた書きされている方は、戻り読みとかすればもう少しスマートになりそうだけど 紹介しておきます。 Text::CSV_XSは日本語の扱いに問題があるって聞いたことあるけど 今はもう直っているのかな?

参考URL:
http://ja.doukaku.org/33/
Jurassic_period
質問者

お礼

こんなサイトがあったのですね! 参考にさせていただきました。 Text::CSV_XSを使用しようか悩みましたが、 問題があるとあちこちで書かれていたため結局やめました… ありがとうございました。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.3

根本部分は他の方がご指摘されておりますのであと   $csv[$i][0] =~ s// /; #空データを半角スペースに置換 これだと、中身がなんでも先頭に必ずスペースが入ってしまう。 まわりくどいけど   if($csv[$i][0] eq ''){ $csv[$i][0] = ' '; } こんな感じでいいんじゃないでしょうか。

Jurassic_period
質問者

お礼

細かなところまで指摘していただいてありがとうございました。 お陰でかなりスッキリしました!

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

split で一気に処理しようなどと思わず, ちょっとずつやっていけばいいのでは?

Jurassic_period
質問者

お礼

回答ありがとうございました。 ちょっとずつやるやり方も分らなかったので質問をしました。

専門家に質問してみよう