質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

1回答

6378閲覧

perlスクリプトからcsvファイルを読み込み特定条件のデータのみを抽出したい

Linkey

総合スコア77

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2017/12/10 16:14

編集2017/12/12 12:34

perlを独学で勉強している者です。
perlスクリプトを実行して以下のことをやりたいです。

①抽出条件の記載されたエクセルファイルを読み込む
②データ.csvを読み込む
③抽出条件に記載された条件のデータを別のテキストファイルに出力し出力したテキストファイルを別フォルダに配置する
条件:部署が「役職」、性別が「男」、年齢が25歳以上

実装途中のperlスクリプトを以下に記載します。いろんなサイトを参考にしてデータの値を出力するところは実装できたのですが抽出条件ファイルの読み込みと判定してからのテキストファイルへの出力、出力されたテキストファイルの移動をどのように実装すればよいか分からず困っています。
perlが得意な方がいましたら、ヒントを教えていただきたいです。

perl

1スクリプト 2#!/usr/local/bin/perl -w 3use strict; 4 5#条件ファイルを読み込む処理未実装 6 7 my $ExcelFile = 'C:/(省略)/address.csv'; # 読み込みEXCELブックファイル 8 my $scalar; 9 my $ref_array; 10 11 my $data = &putExcel2Data($ExcelFile); 12 13 # データ表示 14 foreach $ref_array (@$data) { # $ref_arrayには各行データの配列のリファレンスが格納される 15 print "\n-----------------------------------------------\n"; 16 foreach $scalar (@$ref_array) { # @$ref_arrayは行データの配列で、$scalarにはセルデータが格納される 17 print $scalar, " "; 18 ここに条件判定とテキストファイル出力、フォルダへの移動処理を入れる? 19 } 20 } 21 22sub putExcel2Data{ 23 my ($FilePath) = @_; 24 25 use Win32::OLE; 26 # 指定タイプライブラリのコンスタントが参照可能 27 use Win32::OLE::Const 'Microsoft Excel'; 28 # エラー時に本処理を中止し、Perlがエラーメッセージを出力し、本プロセスが終了する 29 Win32::OLE->Option(Warn => 3); 30 31 # EXCEL使用可能かチェック 32 eval { 33 Win32::OLE->GetActiveObject('Excel.Application'); 34 }; 35 if ($@) { 36 die "Excelが入っていません。$@"; 37 } 38 39 # EXCELオブジェクト取得 40 my $Excel = Win32::OLE->GetActiveObject('Excel.Application') 41 || Win32::OLE->new('Excel.Application', 'Quit'); 42 my $Book = $Excel->Workbooks->Open($FilePath); 43 my $Sheet = $Book->Worksheets(1); 44 45 # 実行数を取得 46 my $RowsCount = $Sheet->Range("A65536")->End(xlUp)->{'Row'}; 47 # 実列数を取得 48 my $ColumnCount = $Sheet->Cells(1, 256)->End(xlToLeft)->{'Column'}; 49 # Cells方式からRange方式に変換 50 my $Range = $Sheet->Cells($RowsCount, $ColumnCount)->Address("RowAbsolute:=False, ColumnAbsolute:=False"); 51 $Range =~ s/$//g; 52 53 my $array = $Sheet->Range("A1:$Range")->{'Value'}; 54 $Book->Close; 55 $Excel->Quit(); 56 return $array; 57} 58

抽出条件ファイルの中身(condition.xlsx)
イメージ説明

address.csvの中身
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KojiDoi

2017/12/10 18:56

'C:/(省略)/address.csv' この中身はどうなっていますか? 各列にどのような形式でデータが入っているのかがわかりません。また、もし拡張子がこの通りなら、このファイルの読み取りにWin32::OLEは不要です。
Linkey

2017/12/11 13:53

address.csvの中身の画像を追加しました
KojiDoi

2017/12/12 04:14

condition.xlsxの年齢ですが、本当にこのように日本語で記述されているのでしょうか。これは誰か他の人がが手で入力したファイルを受け取る前提ですか? そうすると、「25歳以下」とか「25歳未満」とか「25以上」とか「25才以上」とかいった記述もあり得るのでしょうか?
Linkey

2017/12/12 12:35

画像を修正しました。
guest

回答1

0

ベストアンサー

perl

1 # データ表示 2 foreach $ref_array (@$data) { # $ref_arrayには各行データの配列のリファレンスが格納される 3 print "\n-----------------------------------------------\n";

ここで一行分のデータが$ref_arrayに入っているはずなので、抽出条件との照合をここで行なって、合致しないなら処理を止めてしまえばいいでしょう。

大体次のような感じになると思います。私はperlとexcelの共存した環境を持っていないので、以下は実際に試してみてはいませんが、流れは間違っていないと思うので、参考にしてご自分でコーディングしてみてください。

perl

1# まずは照合条件を取り込む 2my $cond = putExcel2Data("condition.xlsx"); 3# $cond->[2][0] == セルA3のデータ("男")となっているはず。 4my $cond_gender = $cond->[2][0]; 5my $cond_position = $cond->[2][1]; 6my $cond_age = $cond->[2][2]; 7 8foreach $ref_array (@$data) { # $ref_arrayには各行データの配列のリファレンスが格納される 9 my $age = $ref_array->[1]; 10 my $gender = $ref_array->[2]; 11 my $position = $ref_array->[4]; 12 13 # 行ごとに「照合条件」を適用してフィルタをかける 14 ($age < $cond_age) and next; # 指定年齢以下なら下の処理は飛ばして次のサイクルへ 15 ($gender ne $cond_gender) and next; 16 ($position ne $cond_position) and next; 17 18 # 条件にマッチしている行についてのみ桁単位の処理を進める。 19 foreach $scalar (@$ref_array) { 20 ...

投稿2017/12/12 18:09

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Linkey

2017/12/14 14:56

ありがとうございます。参考にします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問