![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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
No.3ベストアンサー
- 回答日時:
問題解決済みと思いますが・・・
入力画面から年月を入れて、エクセルで計算結果を表示するプログラムを書いてみました。
#2さんの回答を参考に全角スペースのまま処理できるようになっています。
Windows でしか動きません・・・
参考URL:http://perllearner.web.fc2.com/denwa.htm
わざわざ大変な作業をしていただき、なんと言っていいのか・・とにかく感謝・感謝です。エクセルと連動させることも後々勉強しようと思っていたので大変参考になります。どうもありがとうございました。
m(_ _)m
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/200 …
によると、
「サンプルコードの再配布を承諾無しにしても良い」
(チェックすべきいくつかの項目が挙げられています、要点はオライリーの利益を損なわない(競合しない)ということです。個人的な使用や非営利で使われる)
とありますので、(私の英語力が低いために勘違いしていたら誰か教えて下さい)
こうした(非営利の)Web上でコードを再配布することは問題ないと思います。(ここでいう非営利とは、コードを得るために料金が発生しないというような意味であると思っています)
再配布することが認められているとしても、著作権が放棄されているわけではないので、このような場合には出典などを明記する必要があります。(もっとちゃんとした帰属を明示する必要があるかもしれませんが、クックブックと言えばわかると思っていました。次回から気をつけます)
無知な私に付き合っていただきありがとうございます。有名な書籍なのですね。HPを確認しました。是非購入しようと思います。ご親切にどうもありがとうございました。
m(_ _)m
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;
}
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 日本株 株の損益通算の事でご教授お願いします SBI証券の特定口座源泉徴収有りで個別株を取引してます 元手1 4 2023/06/24 17:32
- その他(パソコン・スマホ・電化製品) OCNとか、 マイネオ管理者に質問、 300khz周波数買いで、毎月¥3,000,000円、 株で、 2 2022/09/10 10:24
- その他(資産運用・投資) 年利回りの計算方法について 5 2023/01/03 19:38
- FTTH・光回線 ソフトバンク光2年縛り IP電話番号 同番移行出来ない? 光回線変更は面倒で難しいですか? 1 2023/01/08 21:54
- docomo(ドコモ) 「d払いご利用可能額」とご利用明細歴」が合わないのは何故ですか? 4 2023/01/28 03:59
- 電気・ガス・水道業 電気、ガスのTEPCOに入っている単身者ですが、昨年両方合わせて10月は7.147円 11月は10. 3 2023/01/27 18:12
- 格安スマホ・SIMフリースマホ 携帯電話料金を抑えたいです 8 2023/04/10 09:41
- ADSL yahooADSL終了ですが、千葉、戸建てで料金重視した場合はどちら良いでしょうか 1 2022/04/08 12:23
- 年末調整 令和4年分 給与所得者の基礎控除申告書 兼 給与所得者の配偶者控除等申告書 兼所得金額調整控除申告書 3 2022/11/04 03:46
- その他(家計・生活費) 老後の資金 6 2022/06/16 20:36
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
12月から1月へのリンク
-
日付の差分の求め方(日、分)
-
C言語のプログラミングについて...
-
体重が3kg増える/減る の英語...
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
文字の横にプルダウンを表示さ...
-
実行時エラー 3020の対策
-
<SELECT>タグの折り返し
-
セレクトメニューで2つの項目...
-
テーブル内でドロップダウンメ...
-
FindFirst を複数条件で検索
-
同じものを繰り返し表示させる
-
VBAでPDFのコピーとリネームを...
-
セレクトボックスの内容を中央寄せ
-
malformed header from script....
-
formで特定のinputを送信しない...
-
print <<"_HTML_"の中でサブル...
-
<python>シンタックスエラーが...
-
複数列を持ったリストボックス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
日付の差分の求め方(日、分)
-
1桁の日付に0を付ける
-
Perlでsprintf("%02d",$month)...
-
2つの日付・時間の差分を求め...
-
日齢計算プログラム
-
a shower.
-
Perlの日付の比較に関して
-
前日の日付取得するには?
-
サマータイムの判定について
-
pythonのプログラミングについ...
-
時間の計算について
-
VBAでオーバーフローが出て困っ...
-
当日の日付をプルダウンメニュ...
-
「型が一致しません」のエラー...
-
perlでcheckboxがうまく整理で...
-
Schemeのプログラミング うる...
-
perl ハノイの塔の解に順番付け...
-
Perlでテキストファイルの読み込み
-
このソースがコンパイルエラー...
-
PerlからMysqlに接続してデータ...
おすすめ情報