• ベストアンサー

Perlでテキストファイルの読み込み

Perl初心者ですがよろしくお願いします。 テキストファイルのデータを読み込んで簡単な計算がしたいのですが、うまくいきません。 data.txt ----------------------------------- 年月    固定電話  携帯電話 18年3月  10,000   15,000 18年2月  12,000   14,000 18年1月  11,000   13,000 17年12月  9,000   15,000 17年11月  9,500   14,000 #(同様に続く) ----------------------------------- 特定の月(例えば17年12月)から過去1年分の固定電話・携帯電話の個別合計とその総計。また、月ごとの合計を出したいのですが、どのようにすればよいでしょうか?ご教授願います。m(_ _)m

  • Perl
  • 回答数4
  • ありがとう数5

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

  • ベストアンサー
  • SE-1
  • ベストアンサー率57% (26/45)
回答No.3

問題解決済みと思いますが・・・ 入力画面から年月を入れて、エクセルで計算結果を表示するプログラムを書いてみました。 #2さんの回答を参考に全角スペースのまま処理できるようになっています。 Windows でしか動きません・・・

参考URL:
http://perllearner.web.fc2.com/denwa.htm
mokomoko_mix
質問者

お礼

わざわざ大変な作業をしていただき、なんと言っていいのか・・とにかく感謝・感謝です。エクセルと連動させることも後々勉強しようと思っていたので大変参考になります。どうもありがとうございました。 m(_ _)m

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#2>#クックブック 2.16(P103)とは何でしょう? オライリー社から出版されている 「Perlクックブック 第2版 VOLUME 1」 http://www.oreilly.co.jp/books/4873112028/ の103ページレシピ2.16を引用・使用しているということです。 (この本は、実用的なPerl コードの豊富なサンプルがあり、私にとってはバイブル的な本です。もし良ければ買ってあげて下さい。) 本の中のサンプルコードは、 原書のサイトである http://www.oreilly.com/catalog/perlckbk2/ のExsample からプログラムのソースをダウンロードすることができます。 (本に載っている全てのコードではありません、断片的なものではなく、完成したプログラムのリストです。<全部チェックしているわけではないので断言はできませんが) 本の末尾に、通常の本ならあるように 「本書の一部あるいは全部について承諾を得ずに複写、複製を禁ず」(要約) とありますが、 オライリー社の 「O'Reilly Policy on Re-Use of Code Examples from Books」 「本のサンプルコードの再利用に関するオライリーのポリシー」(私訳) http://www.oreilly.com/pub/a/oreilly/ask_tim/2001/codepolicy.html によると、 「サンプルコードの再配布を承諾無しにしても良い」 (チェックすべきいくつかの項目が挙げられています、要点はオライリーの利益を損なわない(競合しない)ということです。個人的な使用や非営利で使われる) とありますので、(私の英語力が低いために勘違いしていたら誰か教えて下さい) こうした(非営利の)Web上でコードを再配布することは問題ないと思います。(ここでいう非営利とは、コードを得るために料金が発生しないというような意味であると思っています) 再配布することが認められているとしても、著作権が放棄されているわけではないので、このような場合には出典などを明記する必要があります。(もっとちゃんとした帰属を明示する必要があるかもしれませんが、クックブックと言えばわかると思っていました。次回から気をつけます)

mokomoko_mix
質問者

お礼

無知な私に付き合っていただきありがとうございます。有名な書籍なのですね。HPを確認しました。是非購入しようと思います。ご親切にどうもありがとうございました。 m(_ _)m

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

use encoding "cp932"; $order = "17年12月";#指定年月 ($year, $month) = ($order =~ /(\d+)[^\d]+(\d+)/); $year--; if($month < 12){ $month++; } else { $month=1; $year++; } $lastorder = "${year}年${month}月"; open(IN, "<:encoding(shiftjis)", "data.txt"); <IN>; #項目行読み飛ばし while(<IN>){ ($date, $homephon, $portable) = split(/[  ]+/); if($date =~ /$order/ .. /$lastorder/){ $homephon =~ s/,//g; $portable =~ s/,//g; $sum{'固定電話計'} += $homephon; $sum{'携帯電話計'} += $portable; $sum{$date} = $homephon + $portable; } } close(IN); printf("%sから過去12ヶ月\n", $order); printf("   総計:%10s\n", commify($sum{'固定電話計'}+$sum{'携帯電話計'})); printf("固定電話計:%10s\n", commify($sum{'固定電話計'})); printf("携帯電話計:%10s\n", commify($sum{'携帯電話計'})); do{ $date = "${year}年${month}月"; printf(" %2d年%2d月:%10s\n", $year, $month, commify($sum{$date})); if($month < 12){ $month++; } else { $month = 1; $year++; } }until($date eq $order); sub commify { #クックブック 2.16(P103) my $text = reverse $_[0]; $text =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g; return scalar reverse $text; }

mokomoko_mix
質問者

お礼

返事が遅くなりまして申し訳ございません。 早速やってみます。 #クックブック 2.16(P103)とは何でしょう?

  • SE-1
  • ベストアンサー率57% (26/45)
回答No.1

# こんなんどうでしょう(長くてすみません)。 # 全角スペースでの split がわからなかったので、データはタブ区切りにしています。 # 余計なお世話かもですが、年は西暦にした方が長く使えるかと・・・ my $year = 17; my $month = 12; # コマンドプロンプトから perl xxx.pl 17 12 などとして年月の値を入力するときは my $year=$ARGV[0]; my $month =$ARGV[1]; my $last_year = $year-1; my $last_month = $month+1; if ($last_month ==13){ $last_month = 1; $last_year = $year; } my $mon1 = "$year年$month月"; my $mon2 = "$last_year年$last_month月"; my @one_year_data; open DATAIN, "< data.txt"; while(<DATAIN>){ push @one_year_data, $_ if /$mon1/../$mon2/; } close DATAIN; my ($home_sum,$cell_sum); foreach (@one_year_data){ my @each_data = split ("\t+", $_); $each_data[1]=~ s/,//; $each_data[2]=~ s/,//; $home_sum += $each_data[1]; $cell_sum += $each_data[2]; my $both_sum = $each_data[1]+$each_data[2]; 1 while $both_sum =~ s/(.*\d)(\d\d\d)/$1,$2/; print "$each_data[0]: $both_sum\n"; } my $all_sum = $home_sum+$cell_sum; 1 while $home_sum =~ s/(.*\d)(\d\d\d)/$1,$2/; 1 while $cell_sum =~ s/(.*\d)(\d\d\d)/$1,$2/; 1 while $all_sum =~ s/(.*\d)(\d\d\d)/$1,$2/; print <<TEXT; 固定電話合計 = $home_sum 携帯電話合計 = $cell_sum 総計 = $all_sum TEXT

mokomoko_mix
質問者

お礼

返事が遅れまして申し訳ありません。 早速やってみます。

関連するQ&A

  • テキストデータの読み込みについて

    C言語のテキストデータの読み込みについてです。 C言語のプログラムについてです。 2444,1114,2807, 1984,2845,2086, 658.1,-1564.0,1239.7, -102.0,958.4,123.1, 12.7,6.0,82.7 2439,1110,2802, 1973,2865,2108, 658.8,-1563.7,1239.6, -102.0,957.1,121.9, 12.8,6.0,82.7 2441,1106,2806, 1967,2888,2124, 659.4,-1563.5,1239.5, -102.2,956.4,121.0, 12.8,6.1,82.8 2440,1109,2808, 1964,2896,2127, 660.0,-1563.3,1239.4, -102.7,956.2,120.7, 12.8,6.1,82.8 2441,1112,2807, 1981,2894,2120, 660.6,-1563.0,1239.4, -103.3,956.2,120.1, 12.8,6.1,82.8                                       ↑ 上の様なカンマとスペースで15個に区切られているtxtファイルがあるのですが、このtxtデータの10コ目と11コ目をを計算で使いたく、取り出したいと考えているのですがscanfを使いどのように取り出すことが出来るのか、また取り出したデータから数値を引くことを教えて頂きたいです。 つまり -102.0   958.4 -102.0   957.1 -102.2 と 956.4 -102.7   956.2 -103.3   956.2,             を取り出して計算に使いたいです。 そして1番上の数値だと、 -102.0と958.4 を読み込み、例えばそれぞれ100を引いた値を配列に入れたいです。 -102.0と958.4 → -202.0 と 858.4 のように取り出したいです。 教えて頂きたいです。お願いします。

  • perlを使ったファイルの入出力について

    perl 初心者です。 perl を使ってデータ整理を試みていますが、方法がわからなくて困っています。 やりたい操作は、 1、ディレクトリ内にある特定の拡張子をもつすべてのデータファイルを読み込む 2、データソート 3、データファイル名を変更せずに、ソートしたデータを出力する 例 ディレクトリに以下のデータファイルがあるとします aaa.data bbb.data ccc.data : zzz.data これらのデータファイルをすべて読み込み、中身を整理した後に aaa.txt bbb.txt ccc.txt : zzz.txt となるように、それぞれのデータの名前を変更せずに出力したいと思っています。 スクリプトのサンプルなんかがあればありがたいです。

    • ベストアンサー
    • Perl
  • perl 計算結果をファイルへ出力したい

    perl やり始めたばかりです。宜しくお願いします。 入力ファイル data.txt があるとします。 data.txt は、 123 456 789 333 555 777 以上のようなテキストファイルといたします。このファイルを 以下の様に100分の1にして出力したい。 1.23 4.56 7.89 3.33 5.55 7.77 と言うことで、この場で教えていただきました。それが、以下です。 #!/usr/bin/perl open(IN, "data.txt") or die ; @x = <IN>; close (IN); foreach $line (@x){ chomp($line); @elms = split(' ',$line); foreach $data (@elms){ print $data/100," "; } print "\n"; } おかげ様でこれはこれで上手く動きました。そこで、出力値をファイルに 書き込みたいのです。 もちろん、以下の様な方法でファイルに 書き込めるのは判っております。 計算プログラム.pl > outfile.txt しかし、上のプログラムをベースにファイルに書き込めないかと色々と 試してはみましたが、どうも上手く行きません。 どなたか教えて頂けないでしょうか? 宜しくお願い申し上げます。

    • ベストアンサー
    • Perl
  • ファイル操作について、テキストファイルの書き換え

    よろしくお願いします。 データファイルAからデータを取得して、テキストファイルBの内容の一部を取得したデータで書き換えるという操作を行うプログラムを作りたいです。 具体的には、 データファイルA[A.txt]の中身 111 222 333 444 テキストファイルB[B.txt] 文字列1="123" 文字列2="234" 文字列3="345" 文字列4="456" というような二つのファイルを読み込み、B.txtの""で囲まれた部分を、A.txtで取得したデータで置き換えるような操作を行いたいのですが・・。 使用する言語としてはスクリプト言語であるperl、もしくはプログラム作成経験があるCを使用しようと思っています。(perlは未経験で入門書を読んでいるレベル)

    • ベストアンサー
    • Perl
  • C++ ドラッグ&ドロップによるテキストデータ読込

    C++初心者です。 aaa.txtのデータ(数値がたくさん並んでいるもの)を読み込んである列の平均値を出すなど計算したいと思っています。 しかしaaa.txt以外にも計算したいテキストデータがたくさんあり、そのたびいちいちソースを弄ってテキストの名前を変えるのはおっくうです。 今は、次のようにファイルを読み込んでいます。 ifstream ifs("aaa.txt"); そこでexeファイルにドラッグ&ドロップしてそのテキストファイルの数値を勝手に読み込んでくれるように改変できるでしょうか?

  • perl ファイルのデータを編集したい

    初めまして、perl をやり初めたばかりです。作業は Linux 上で行ってます。 あるテキストファイル data.txt があります。 data.txt の中は、以下のようになっているとします。 100 200 300 400 500 600 これを読み込んで、例えば、 1 2 3 4 5 6 以上の様に各数字を百分の一にして出力したいと思ってます。 一応、色々と調べながらプログラムを書いてはみましたが 思う様に出力されません。以下そのプログラム。 #!/usr/bin/perl open(IN, "data.txt") or die ; @x = <IN>; close (IN); $ref_x = \@x; $n_data = @x; for ($i = 0; $i< $n_data; ++$i) { $$ref_x[$i] /= 100 ; print $x[$i], " "; } print"\n"; どなたか、perl にお詳しい方教えていただけないでしょうか? 宜しくお願い申し上げます。

  • N-04Aでテキストファイルを表示したい

    N-04AのmicroSDカードに拡張子が.txtのテキストデータを読み込み、 携帯に表示したいと思っています。 ドコモケータイdatalinkというソフトからtxtデータを読み込もうとしたのですが、形式が対応していないというエラーになりました。 説明書にはtextファイルが読み込めるというような記述がありました。 どのようにすればテキストデータが表示できるのか、お分かりになる方がいらっしゃいましたらよろしくお願いいたします。

  • テキストファイルの編集

    以前にもperlでのプログラミングについて質問させて頂いた者です。 前回と被る所があるのですがちょっと複雑で、私の手に負えないので質問させて頂きます。 よろしくお願いします。 データファイルAからデータを取得して、テキストファイルBの内容の一部を取得したデータで書き換えるという操作を行うプログラムを作りたいです。 具体的には、 データファイルA[A.txt]の中身 100 111  200 222 300 333 400 444 テキストファイルB[B.txt] 1st step 文字列1 start="123" end="134" 2nd step 文字列2 start="234" end="245" 3rd step 文字列3 start="345" end="356" 4th step 文字列4 start="456" end="467" という二つのファイルを読み込み、B.txtの""で囲まれた部分を、A.txtで取得したデータで置き換えるような操作を行いたいのですが・・。 A.txtの一行目で取得したデータをB.txtの1stステップの始まりと終わりの値として置き換え、それを二行目は2ndと同様の操作を行うようなプログラムを作りたいです。 もともとこのような操作を行いたくて前回のような質問をし、それを参考にし今日まで考えましたがやはり難しく、また頼りたいと思います。。 どうかよろしくお願いします。

    • ベストアンサー
    • Perl
  • PHPで複数のテキストファイルを読み込みたい

    PHPを勉強中です。 どうしても自力で解決できないので助けてください。 やりたい事は、 「複数ファイルの内容を読み込み、  それらのデータをcsvのセルに入れたい。」のです。 Aというフォルダに、複数のテキストファイルがあります。 これら各ファイルの内容をそれぞれ取得して 「○○.csv」のB列に上から順々に書き込んでいきたいのです。 Aフォルダに入っているテキストファイルは連番を想定しています。 A/ 0001.txt 0002.txt 0003.txt : フォルダに入っているテキストファイルの数はいろいろです。 3枚のフォルダもあれば100枚のフォルダもあります。 これらのファイルの内容を、それぞれ取得して 用意されているcsvファイルの特定のセルに テキストファイルの数だけ順番に入れていきたいのです。 ○○.csv A列  |  B列  |  C列  | △  |0001.txt内容|  △  | △  |0002.txt内容|  △  | △  |0003.txt内容|  △  | : : プログラムのヒントを教えていただければ嬉しいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • Perlでのデータ処理について初歩的な質問

    現在Perlでデータ処理をしています。処理を進めていき、下のようなデータを得ることができました。 Question1 1→2 2→4 3→3 2→6 4→4 Question2 1→2 3→4 2→3 4→2 3→3 このようなデータがa.txt,b.txt,,,e.txtというように5個あります。 これらのデータからそれぞれ、Question1の1,2,3,4とQuestion2の1,2,3,4の→のあとの数字の合計をa_out.txt,b_out.txt,,,e_out.txtとして一気に出力させたいです。 ただし、Question1に2→4と2→6のように、二つのデータがある場合は、より後ろにあるデータ(この場合だと2→6)を足し合わせることにしたいと思っています。 明快な方法がなかなか思いつかないので、力を貸していただけたらと思います。

    • ベストアンサー
    • Perl

専門家に質問してみよう