アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつも大変お世話になっております。
エクセルブック(.xls)に週報データが保存されています。
1週が1sheetになっているため1ファイルに53sheet入っています。

10年分のため、10ファイルあります。

各sheetは同じフォーマットで入っています。

これらをPERLで一括して読み込みたいと思っています。

従来は、1sheetずつ .csvに変換して、読み込んでいました。

しかし これらだと530回 .csvに吐き出す処理が必要で、根気が続きません。

バッチ処理で一気に.csvに吐き出すか、あるいは.csvに吐き出さずに
.xlsのまま、読み込みたいと思っています。

PERLは active perl 5.14.2をWindows 7のコマンドプロンプト上から起動しています。

ご指導のほど宜しくお願い申し上げます。

A 回答 (6件)

> Wide character in print at ..



お馴染みの警告です。
そのままのメッセージで検索すれば、原因と対処法がわかると思います。

http://www.rwds.net/kuroita/program/Perl_unicode …
    • good
    • 0
この回答へのお礼

重ね重ね 初歩的なことでご指導ありがとうございました。
試行錯誤していますが、まだうまくいきません。
スレッドを改めて、質問させていただこうと思います。

今後ともひきつづきご指導よろしくお願い申し上げます。

お礼日時:2013/03/03 22:44

素直に、ppmでspreadsheet-ParseExcel をインストールしたらいいのでは?


http://code.activestate.com/ppm/Spreadsheet-Pars …

あと、CPANでの説明にあるように、ParseExcelはxls用で、xlsxにはxlsxを使う、というのは良いですね?
http://code.activestate.com/ppm/Spreadsheet-xlsx/

この回答への補足

動きました! すばらしいです!!

あと10個のファイルのうち5個で
Wide character in print at ..
というエラーが出て、出力が文字化けしています。

atの指しているのは print OUT $sDT."\n"; の行です。

5個は他のファイルとフォーマットも同じで、いまのところ何が原因かわかりません。

なにか、お心当たりないでしょうか。。。

補足日時:2013/02/28 10:44
    • good
    • 0

質問とは的外れかもしれません。


ご参考までに下記します。
ブック毎に1クリックでブック内の全てのシートをCSVに変換するソフトを提案します。
このソフトだと10年分をCSVに変換するために10回ほど作業(10回のクリック)を行なう必要があります。

質問の作業がどのような頻度で発生しているのか、又、CSVへの変換が単純変換なのか条件付変換なのか
不明な状態での提案です。
悪しからず。
以上
    • good
    • 0
この回答へのお礼

おっしゃるとおり、めったにない作業です。
ですので1年分ごとにクリックしてで問題ありません。
ありがとうございました。

お礼日時:2013/02/28 08:51

excelのデータだけ取るなら、モジュール「Spreadsheet::ParseExcel」はたいへんな優れものです


ピュアperlなのでLinuxでも動きます

モジュールのサンプルを見て作った実際動く実験プログラムのサブルーチン部分(モジュールバージョンは0.59)を以下に
プログラム全体の都合上、utf8で作ったけど、その辺はいろいろと試してください

わかってるとおもいますが本体に
use Spreadsheet::ParseExcel;
宣言が必ず必要です
また、Excel形式のCSVはセル内に改行やコンマなどがあった場合、ちょっとした加工が必要です
################################################################################
################################################################################
################################################################################

 my $sFN = 'エクセルファイル名.xls';
 ## **************************************************************************
 my $filename = $sFN;
 ## **************************************************************************
 my $parser = Spreadsheet::ParseExcel->new();
 my $workbook = $parser->parse( $filename );
 ## **************************************************************************
 if ( !defined $workbook ) { die "Parsing error: ", $parser->error(), ".\n"; }
 ## **************************************************************************
 my $sRT = '';
 ## **************************************************************************
 ## シートの数だけ繰り返し
 for my $worksheet ( $workbook->worksheets() ) {
  ## 1シート分、縦横のカラム数
  my ( $row_min, $row_max ) = $worksheet->row_range();
  my ( $col_min, $col_max ) = $worksheet->col_range();
  ## **************************************************************************
  my $sK = '';
  my $sV = '';
  ## ----------------------------------------
  my @aROW;
  ## 縦の段を上から順に行単位で処理
  foreach my $nLineY ( $row_min .. $row_max ) {
   my @aTMP;
   foreach my $nLineX ( $col_min .. $col_max ) {
    my $cDT = $worksheet->get_cell($nLineY,$nLineX);
    my $sTMP = '';
    ## セルにデータが在ったときの処理
    if($cDT){ $sTMP = $cDT->value(); }
    push(@aTMP, $sTMP);
   }
   my $sCOL = join(",",@aTMP);
   push(@aROW,$sCOL);
  }
  ## ----------------------------------------
  ## 蓄積したテーブル群を一個に変数にまとめる
  my $sDT = join("\n",@aROW);
  ## ----------------------------------------

  ## **************************************************************************
  ## last;
  print $sDT."\n";
  print "******************************************************\n";
  print "******************************************************\n";
 }

################################################################################
################################################################################
################################################################################
インデントのため行頭には全角スペースを入れてますのでコピペの場合はご注意を

以上、ご参考になればいいのですが

この回答への補足

コードから、注意点までご親切にありがとうございます。

Windows 7のコマンドプロントから実行しています。

http://search.cpan.org/dist/Spreadsheet-ParseExc …
から
Spreadsheet-ParseExcel-0.59.tar.gz
をダウンロードしてきて解凍したのち、
perl MakeFile.PL
としたところ、以下のメッセージが出ました。

It looks like you don't have a C compiler on your PATH, so you will not be able to compile C or XS extension modules. You can install GCC from the
MinGW package using the Perl Package Manager by running:

ppm install MinGW

Writing Makefile for Spreadsheet::ParseExcel
Writing MYMETA.yml

そののち、
Warning: prerequisite ...
という警告メッセージが4行でました。

そこで
ppm install MinGW
を実行したところ、なにかインストールしてくれました。

そこでもう一度
perl MakeFile.pl
をやりましたが、同じ結果となります。

perlは環境づくりが難しいです。。。

この点 ご指導お願いいたします。

補足日時:2013/02/27 19:24
    • good
    • 0

http://search.cpan.org/dist/Spreadsheet-ParseExc …
http://search.cpan.org/~dmow/Spreadsheet-XLSX-0. …
ってモジュールがあります。

使ったこと無いので、どの位うまくできるか、はわかりません
    • good
    • 0
この回答へのお礼

これが評判のParseExcelですね。ダウンロードしてみました。
ありがとうございました。

お礼日時:2013/02/28 08:50

Win32::OLE で Excel を操作できる.

    • good
    • 0
この回答へのお礼

いろいろあるのですね。。

お礼日時:2013/03/03 22:45

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