Perlでリクに答えるスクリプトを作るスレ

このエントリーをはてなブックマークに追加
940デフォルトの名無しさん:2009/10/07(水) 17:06:28
>>939
>>936
> これはどういう処理でしょうか…?

処理の「なかみ」を誤解して書いたものです。

>>937
誤りかもしれないと思い直し、手順確認です。
941デフォルトの名無しさん:2009/10/26(月) 10:50:52
perlで作れるかわかりませんが、スクリプト作成お願い致します。
にこさんうどからmp3を取得するperlスクリプトを作成して頂きたいのです。
http://nicosound.anyap.info/

イメージ的には、
「get_nico_sound sm12345」「get_nico_sound nm54321」
などのコマンドを入力することによって
mp3がダウンロードされれば良いと考えております。

wgetでダウンロードを試みても上手くいかなかったので…
どなたかよろしくお願い致します。
942デフォルトの名無しさん:2009/10/26(月) 18:58:11
氏ね
943デフォルトの名無しさん:2009/11/24(火) 17:38:21
>>941
自分で作れカス
944デフォルトの名無しさん:2009/11/26(木) 02:02:02
ニコニコ静画から指定したジャンルの画像を自動で落としてくるプログラムお願いします。
945デフォルトの名無しさん:2009/11/26(木) 02:02:58
>>941
俺も頼みます!
946デフォルトの名無しさん:2009/11/27(金) 07:20:16
>>941 出来なくは無いけど面倒くさい
947デフォルトの名無しさん:2009/11/28(土) 03:22:17
とあるプログラムで出力データファイル名、取引先名、出荷商品数の合計を1つのテキストファイルに出力をするスクリプトをお願いします。
卸売りをする中小企業で働いている者で、かなり昔に作られたプログラムの出力データファイルが存在し、
出力されたデータファイルは1000ファイルほどあり、自社名略称 商品コード略称 拡張子というファイル名です。
例えば、自社名がJALだとしたら、jal110b.ors(拡張子orsとありますが、実際はただのtxtファイルです。)となります。
出力データファイルの中身は最初の10行くらいは商品の説明や仕入先、原価などが書いてあり、その下に出荷をした企業の詳細が書いてあり、

No 取引先名 価格 値引き 出荷商品数 日付 備考
1  NCA   700  100    40    001112 担当○○様
2  BKG 700  20     001113 担当XX様
3  AOK    700  100    32     001113 出荷予定日は00年11月13日だが、担当者不在なので11月15日に延期
4  NCA   700        10     001115 追加分

といった行列が存在します。他の担当者の方が、出力データファイル名と取引先名のみが書かれたリストを作成し、
そのリストを読み込んで、出力データファイル名、取引先名、出荷商品数の合計を1つのテキストファイルに出力するプログラムを
最初はPerlを少しかじったことのある私でも組めるだろうと思っていたのですが、
取引先によって、値引きが書いてあったり書いてなかったりするので、splitで分割をすると出荷商品数の列が合わなくなり困り果てています。
948947:2009/11/28(土) 03:23:33
こういうデータの入ったファイルから、出力データファイル名、取引先名、出荷商品数の合計を
以下の例のように1つのテキストファイルに出力するスクリプトを書いてはいただけないでしょうか?

このファイルを読み込み、(左から、出力データファイル名、取引先名)

110b NCA
110c KBA
110d NCA
       ... 下にまだ300行近くあります

以下を1テキストファイルに出力。(左から、とあるプログラムで出力データファイル名、取引先名、出荷商品数の合計)

jal110b.ors NCA 50
jal110c.ors KBA 79
jal110d.ors NCA 80

よろしくお願い致します。
949デフォルトの名無しさん:2009/11/28(土) 04:12:39
タブ区切りのファイルなの?
値引きがない場合はタブが連続して二つ付いてるとかならまだわかるけど、
説明の読んでもどうやって値引きが書いてないかを判別すれば良いのかわからんな。
他のフィールドは必ず書かれてるっていうのなら区切った後に配列の数が一つ少ないかどうかで判断できるけど。
950デフォルトの名無しさん:2009/11/28(土) 04:21:45
>>949
確認したところスペース区切りです。
出荷商品数を列にそって計算するといった方法はPerlではできないのでしょうか?
951デフォルトの名無しさん:2009/11/28(土) 04:42:41
>>950
出荷商品数までに何文字あるか分かればできると思う
40文字あるとした場合には、

foreach(@table){
/^.{40}[0-9]*?([0-9]+)/;
$count += $1;
}

それよりインプット側のファイル内の表の部分だけ抜き出すのをどうするかのほうが大事だと思うんだが
改行区切りされてても例えば企業の詳細なんかに改行使われてたら難しくなりそうな
952デフォルトの名無しさん:2009/11/28(土) 05:28:21
一度Ruby辺りを使って、取引先名と出荷商品数のみを全抽出したがいいかもね
953デフォルトの名無しさん:2009/11/28(土) 05:41:59
いやgrep検索でいけるだろ
954デフォルトの名無しさん:2009/11/28(土) 06:54:57
どっちにしても列があってないと厳しいな
確実じゃないが、splitで切るよりも文字数範囲指定で抽出がベストか
賢者求む
955デフォルトの名無しさん:2009/11/28(土) 08:12:36
#!/usr/bin/env perl
use strict ;
use warnings ;
sub get_sum {
my ($name, $sbj ) = @_ ;
my $sum = 0 ;
open my $fh, '<', $name . '.ors' or die ;
while (<$fh>){
next if ! /^\d+\s+$sbj\s+(?:\d+\s+){1,2}(\d+)\s+\d{6}/ ;
$sum += $1 ;
}
close $fh ;
return join "\t", $name, $sbj, $sum ;
}

while (<>){
printf "%s\n", get_sum split /\s/, $_ ;
}
956デフォルトの名無しさん:2009/11/28(土) 08:18:39
1. 上を適当な名前(get.pl)で保存。
2. perl get.pl DATABASE
 で実行。( DATABASE は、>>948 の入力ファイル)

注)
1. DATABASE の 110b とかは、「自社名略称 商品コード略称」が連結されてる
 フォーマットだよね? ちがうならちょっと手なおしが必要。
2. スペース区切りは本当にスペース? 全角空白だったらお手上げ。
3. 日付が 6文字の数字決めうち。
957デフォルトの名無しさん:2009/11/28(土) 13:05:57
ニコニコ静画から指定したジャンルの画像を自動で落としてくるプログラムお願いします。
958デフォルトの名無しさん:2009/11/28(土) 15:36:09
お聞きしたいことがあります。

土曜日、日曜日の0〜9時はエラー
月曜〜金曜の0〜18時は〜エラー
それ以外はOK
という感じにしたいのですが、

&time_data;
if($ww eq Sat or Sun and $hour>=0 and $hour<9){&error("エラーです");}
elsif($ww eq Mon or Tue or Wed or Thu or Fri and $hour>=0 and $hour<18){&error("エラーです");}

これだと全部エラー判定になるのですが、どこをどう修正すればいいでしょうか。
よろしくお願いします
959デフォルトの名無しさん:2009/11/28(土) 16:01:37
>>958
スレ違い

if($ww eq 'Sat' or $ww eq 'Sun'){
if($hour>=0 and $hour<9){&error("エラーです");}
}
else{
if($hour>=0 and $hour<18){&error("エラーです");}
}
960958:2009/11/28(土) 16:40:24
すいませんスレ違いでした。
ご修正ありがとうございました。うまく機能しました
961デフォルトの名無しさん:2009/11/28(土) 19:30:08
>>956
ありがとうございます。
説明不足があった点があるので書いておきます。
110bというのは、商品コード略称のみです。正確には、jal110b.orsが正しいのですが
このリストをまとめた人が、自社名略称と拡張子を省略しているため、110bのみになっています。
スペース区切りはスペースで問題ありません。
962961:2009/11/28(土) 19:36:33
さらに追記です。
文字数を計算したら、一応規則的に並んでいるのが分かりました。
出荷商品数の数字の部分は左から35文字目から始まるのですが、
$name, $sbjはそのままで、出荷商品数の合計値を文字数で換算して狙い撃ちはできないものでしょうか?
963デフォルトの名無しさん:2009/11/28(土) 21:28:15
>>955
my ($name, $sbj ) = @_ ;

my $name = 'jal' . $_[0] ;
my $sbj = $_[1] ;
へ変更。
×printf "%s\n", get_sum split /\s/, $_ ;
printf "%s\n", get_sum split /\s+/, $_ ;

にしたら望みの結果が得られるはず。
964デフォルトの名無しさん:2009/11/28(土) 22:02:41
>>962
文字数が固定してるなら、substr 関数で切り出せばいいよ。
あとはゴリゴリとコードを書くだけ。
965デフォルトの名無しさん:2009/11/28(土) 22:17:42
perlでcsvをphpとかcgiに出力できますかね。
966デフォルトの名無しさん:2009/11/29(日) 00:29:16
できます。
967デフォルトの名無しさん:2009/11/29(日) 00:36:39
>>941はもう無理ですかね…
どなたかお願い致します。
968デフォルトの名無しさん:2009/11/29(日) 00:49:28
>>957
はどうする
969デフォルトの名無しさん:2009/11/29(日) 01:58:34
>>963-964
ありがとうございます。
>>963>>955のコードをsubstrに対応させるにはどうすれば良いのでしょうか?
970デフォルトの名無しさん:2009/11/29(日) 05:27:27
>>969
ここをこう直せばおk
($sbjが他のフィールドに出てこないことが前提ですが)

while (<$fh>){
next if !/$sbj/;
my @list = split /\s+/, substr $_, 34;
$sum += $list[0];
}
971デフォルトの名無しさん:2009/11/29(日) 19:47:35
>>970
ありがとうございます。確認してみたところ、$sbj以外にも合致するフィールドが存在するみたいで、
合計値が狂ってしまうようです。
また、出力データファイル名の取引先名も規則正しく、11行目から始まるみたいなので、
next if !/$sbj/; ではなく、my @list = split /\s+/, substr $_, 34;のように文字数指定でいけないでしょうか?

再び追記なのですが、リスト参照のみの合計値の出力とは別に、
出力データファイルに存在するすべての取引先名の合計値の出力も得たいのですが、
この場合はどうすればよいのでしょうか?

お手数をおかけいたします。
972デフォルトの名無しさん:2009/11/29(日) 20:44:09
特定されない程度に文字を置き換えて入力ファイルをアップしてくれた方が早く終わりそうだけどそれは無理なのかね?
973デフォルトの名無しさん:2009/11/29(日) 20:55:00
分かりました。少々お待ちください。
974デフォルトの名無しさん:2009/11/29(日) 21:09:20
975デフォルトの名無しさん:2009/11/29(日) 21:20:43
ニコニコ静画から指定したジャンルの画像を自動で落としてくるプログラムを作りたいのですが、わかりません。

予想

API取得して
画像の番号を取り出す 正規表現?
※画像番号のあとにある"s"は取り出さない
http://lohas.nicoseiga.jp/img/ $画像番号."l"

ディレクトリに保存

差分保存する? bbsの題名ごとに??
※既に落としたものは再び見に行ったときには落とさない

繰り返し while使うのかな?
976デフォルトの名無しさん:2009/11/30(月) 04:48:57
>>974
じゃあこんな感じではいかがでしょう
while (<$fh>){
/^.{10}(\w+)\s/;
my $current = $1;
next if $current !~ /$sbj/;
my @list = split /\s+/, substr $_, 34;
$sum += $list[0];
}

サンプルファイルだと、
フィールドは13文字めから始まるように見えるのですが、
だったら適当にかえてください
977デフォルトの名無しさん:2009/11/30(月) 11:12:53
ファイル見た感じだと>>955の正規表現の先頭に\s+でいけたんだけどどこで失敗したんだ?
取引先名も英語3文字だから他で一致しなそうだけど
978デフォルトの名無しさん:2009/11/30(月) 20:40:48
>>975
すまんがその日本語から察するとあなたにプログラムは書けないと思う
979デフォルトの名無しさん:2009/12/02(水) 20:38:41
>>978
うるうる
980デフォルトの名無しさん:2009/12/04(金) 01:30:06
2chのスレをHTML保存した後AAだけにしてtxtで保存するスクリプトを作りたいのですが。
また、指定したスレではなく、AAサロンとかのスレすべてから・・・という形にしたいんですが。
981デフォルトの名無しさん:2009/12/04(金) 01:30:52
>980
ミスったので、訂正します。

2chのスレをAAだけにしてtxtで保存するスクリプトを作りたいのですが。
また、指定したスレではなく、AAサロンとかのスレすべてから・・・という形にしたいんですが。
982デフォルトの名無しさん:2009/12/04(金) 09:29:32
>>981
で、どの部分がうまく動かないのだ?
Perlの質問だからね、ソースが無いとアドバイスできないなぁ。

そのアルゴリズムの解説には本が一冊できそうだよ。
983デフォルトの名無しさん:2009/12/04(金) 09:31:18
いやぁ、質問スレじゃなかったよ。

逝ってくる。
984デフォルトの名無しさん:2009/12/04(金) 12:36:22
>>982
文章かAAかの切り分けはそんなに難しくないだろう。
形態素分析にでもかければ「文章らしさ」のチェックができるから、
スコアが低いのがAA。
AAか任意の文字列かの切り分けはAIの世界の話だが。

まあ、

ノシ
OTZ

みたいな単発AAは難しいけどな。
前者、人間にだって、予備知識がなければ熨斗なのか手を振ってるのか普通にわからん。
後者、OTZはラルフ・ウィエン記念空港の空港コードだしな。
985デフォルトの名無しさん:2009/12/04(金) 16:40:51
>>982
質問じゃなくねw?
986デフォルトの名無しさん:2009/12/04(金) 16:43:46
Perlでリクに答えるスクリプトを作るスレなんだし、書いてやろうぜぇ!
987デフォルトの名無しさん:2009/12/04(金) 17:46:39
初心者の俺でもできるリクエストなら作ってあげるけど。。。
988デフォルトの名無しさん:2009/12/05(土) 01:14:07
ニコニコ動画から作業用BGMを自動で落としてくるプログラムお願いします。
989デフォルトの名無しさん
>形態素分析にでもかければ「文章らしさ」のチェックができるから、

両手をパタパタすれば空を飛べるから。