Perl初心者スレ(マジレス回答) (523レス)
Perl初心者スレ(マジレス回答) http://mevius.5ch.net/test/read.cgi/tech/1349538519/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
432: デフォルトの名無しさん [] 2018/08/05(日) 07:50:18.49 ID:cdvogGHQ >>428 ところで元のプログラムに「16進バイナリデータを・・・」というコメントが入っているのだろうが、呼び出す側は実際には何を渡している? 仮に元がバイナリだったとしても unpack('N', ...) のようなことをしていない? だとするとそこでバイナリから Perl の 変数への変換自体は終わっている。 つまり、コメントが紛らわしい表現になっているだけ。 http://mevius.5ch.net/test/read.cgi/tech/1349538519/432
433: 427です これは書けるかな? [sage] 2018/08/05(日) 12:21:43.54 ID:gWGunr7x >430-432 スミマセンです。 orz もっと詳しく書こうとするとマンゴースレでもブロックされました。 ぶっちゃけ、この中の ttp://motor.geocities.jp/resermail/dc10tools.zip 「dc10mov2csv.pl」内です。 gps_data{'latitude'}の部分からです gps_data{'bearing'}の式は 変換が単精度浮動小数点数(float)のIEEE754 単精度float変換で合ってますか? これをベースに別メーカー機種の同様な構造を持つデータでの他言語の変換プログラムを考えているので。 http://mevius.5ch.net/test/read.cgi/tech/1349538519/433
434: デフォルトの名無しさん [] 2018/08/05(日) 17:23:40.10 ID:cdvogGHQ >>433 pack, unpack の f は機種依存なので IEEE 754 単制度になるかどうかはプログラムからだけではわからない。 http://perldoc.jp/func/pack まあでも今時の普通のPC用Perlならなってそうな気がするけどね。 latitude って緯度か。GPSデータのバイナリをPerlの変数に入れているということだな。 だから下2桁を60進法で考える必要があると。 やはりそのプログラムのコメントは紛らわしいってだけだよ(サブルーチン名も紛らわしいが)。 bin_convert 呼ぶときには既にバイナリから float に unpack されてるから。 で、bin_convert 内でやっているのは先に書いた通り下2桁を60進法で小数点以下の値にしてるってことね。 http://mevius.5ch.net/test/read.cgi/tech/1349538519/434
435: 427です [sage] 2018/08/05(日) 21:57:54.47 ID:gWGunr7x >>434 ありがとうございます。 全体からずらして抜いたもの60進法にしてるだけなんですね。 てっきりバイナリから浮動小数点を出す特殊計算かと思っていました。 適当にがんばります。 http://mevius.5ch.net/test/read.cgi/tech/1349538519/435
436: デフォルトの名無しさん [sage] 2018/10/05(金) 20:29:10.24 ID:ZpFL29Ml 「サンプル」のCSVを文末の「結果」に変換するプログラムをPerlで作りたいです。 ● サンプルのCSVの構造: 1コラム目:数字8桁の昇順、2コラム目:数字1桁、3コラム目:文字列 ● 作りたいプログラム: 1コラム目、3コラム目は保持する。複数レコードで1コラム目に重複があれば、 それらの複数レコードの2コラム目の1桁数字を連番にする。 1コラム目に重複がない場合は、当該レコードの2コラム目を1にする。 ● 「サンプル」 06030002,6,文字列A 06030004,3,文字列B 06030004,4,文字列C 06030004,5,文字列D 06030005,3,文字列E 06030005,4,文字列F 06030006,3,文字列G 06030006,4,文字列H 06030006,7,文字列I 06030007,3,文字列J 06030008,3,文字列K ● 「結果」 06030002,1,文字列A 06030004,1,文字列B 06030004,2,文字列C 06030004,3,文字列D 06030005,1,文字列E 06030005,2,文字列F 06030006,1,文字列G 06030006,2,文字列H 06030006,3,文字列I 06030007,1,文字列J 06030008,1,文字列K http://mevius.5ch.net/test/read.cgi/tech/1349538519/436
437: デフォルトの名無しさん [sage] 2018/10/05(金) 21:39:08.56 ID:liWk4NPs まずは自分で書いてみたコードを晒すところからだな。 http://mevius.5ch.net/test/read.cgi/tech/1349538519/437
438: デフォルトの名無しさん [] 2018/10/05(金) 22:57:27.02 ID:kjx9soPU 一行プログラムが思い浮かんだ。 最初の列をハッシュのキーにして3列目をpush。 全部読んだらキーをソートして読んだ内容に番号降りつつ出力。 しかし俺は今電車の中からスマホで書いてるのでここに書く気が起きない。 http://mevius.5ch.net/test/read.cgi/tech/1349538519/438
439: デフォルトの名無しさん [sage] 2018/10/06(土) 00:22:39.61 ID:mGKg2bAW Ruby で作った require 'csv' count = Hash.new( 0 ) # 初期値は、0 # コロン区切りのCSV 入力ファイルを、1行ずつ処理する CSV.foreach( "input.csv" ) do |row| count[ row[ 0 ] ] += 1 row[ 1 ] = count[ row[ 0 ] ] puts row.join( "," ) end http://mevius.5ch.net/test/read.cgi/tech/1349538519/439
440: デフォルトの名無しさん [sage] 2018/10/06(土) 02:20:13.04 ID:m3dYH3N7 考え方は >>439 と同じ perl -pe "s/^([^,]+,)[^,]+/$1.++$count{$1}/e" < sample.csv http://mevius.5ch.net/test/read.cgi/tech/1349538519/440
441: デフォルトの名無しさん [sage] 2018/10/06(土) 03:33:56.69 ID:gPBhgV7B my @y = ""; while(<>) { my @x = split ","; # $x[1] = $x[0] eq $y[0] && ++$y[1] || 1; $x[1] = $x[0] ne $y[0] || ++$y[1]; print join ",", (@y = @x); } ウチでやるならこうかしら http://mevius.5ch.net/test/read.cgi/tech/1349538519/441
442: 438 [] 2018/10/06(土) 06:07:28.44 ID:J8Y2BFN6 おはよう。 元のテキストが s.txt に入っているとして、こうする。 perl -ne 'chomp;@d=split/,/;push(@{$h{$d[0]}},$d[2]);END{for(sort keys%h){for($i=0;$i<@{$h{$_}};$i++){print join(",",$_,$i+1,$h{$_}[$i])."\n"}}}' s.txt なげーなw http://mevius.5ch.net/test/read.cgi/tech/1349538519/442
443: 438 [] 2018/10/06(土) 06:21:52.15 ID:J8Y2BFN6 あ、そうか。貯め込む必要はなくてハッシュ作ってそのまんま出せば良いんだよな。 じゃあawkの方が楽ではないか? awk -F, 'BEGIN{OFS=","}{n[$1]++;print $1,n[$1],$3}' s.txt http://mevius.5ch.net/test/read.cgi/tech/1349538519/443
444: デフォルトの名無しさん [sage] 2018/10/06(土) 17:28:12.58 ID:MMGbFZjG 436です。皆様ありがとうございました。 自分では1行ずつ処理することまでしかできず、複数レコードの 1コラム目の比較をすることができませんでした。 おかげさまで体育の日に子供の運動会に行けます! ありがとうございました! http://mevius.5ch.net/test/read.cgi/tech/1349538519/444
445: デフォルトの名無しさん [sage] 2018/11/11(日) 14:10:45.60 ID:eqm/EHYd 上の方のレスにも関連したものがありますが、 ファイルから読み込んだ文字列データにて パターンマッチがヒットしません。 同一文字列を直接コード内に定義すると、ヒットします。 出来ればファイルに切り出したいので、 ご教示いただけますでしょうか。 http://mevius.5ch.net/test/read.cgi/tech/1349538519/445
446: デフォルトの名無しさん [sage] 2018/11/11(日) 14:11:11.73 ID:eqm/EHYd [環境] Activeperl win8.1 or 2016 server perl -v This is perl 5, version 24, subversion 3 (v5.24.3) built for MSWin32-x64-multi-thread [コード utf-8で作成] #res[1]にはcp932のコードの「テスト」を含む文字列が格納されている。 $res[1] = Encode::decode('cp932', $res[1]); #patern.txtはutf-8で「テスト」の文字列が格納されている。 open (FILE, "<:utf8", "patern.txt") or (die "$!"); my $line = <FILE>; close(FILE); #$line = 'テスト';←#を外して直接コードに書くとヒットする。 print encode('cp932', $line);(正常に取得できている。) if ($res[1] =~ /$line/){ print "Hit!"; } else{ print "not Hit"; } ---出力--- >テスト >not Hit http://mevius.5ch.net/test/read.cgi/tech/1349538519/446
447: デフォルトの名無しさん [sage] 2018/11/11(日) 16:14:59.60 ID:56YuZzmp >>446 改行文字の有無? http://mevius.5ch.net/test/read.cgi/tech/1349538519/447
448: デフォルトの名無しさん [sage] 2018/11/11(日) 18:17:18.70 ID:t5AG7sJB たぶんそれだな。$line の中身が "テスト\r\n" または "テスト\n" になってそう。 http://mevius.5ch.net/test/read.cgi/tech/1349538519/448
449: デフォルトの名無しさん [sage] 2018/11/12(月) 00:16:54.10 ID:MtlIUxHY chomp($line); するべき http://mevius.5ch.net/test/read.cgi/tech/1349538519/449
450: デフォルトの名無しさん [] 2018/11/12(月) 07:45:13.53 ID:8fj5l105 遅くなりすみません。 テストファイルには改行を入れていなかったのですが、 chompが必要なのですね。 ファイルからレコードを取得するにはchompが必要と勉強になりました。 ありがとうございました。 http://mevius.5ch.net/test/read.cgi/tech/1349538519/450
451: デフォルトの名無しさん [] 2018/11/12(月) 09:22:08.61 ID:I5PkaEyl >>450 いや、改行は入っていると思うぞ。でなければあのプログラムでは一致する。 http://mevius.5ch.net/test/read.cgi/tech/1349538519/451
452: デフォルトの名無しさん [sage] 2018/11/13(火) 17:15:58.77 ID:WOZg75XW utf-8がボムがついている可能性もあるね http://mevius.5ch.net/test/read.cgi/tech/1349538519/452
453: デフォルトの名無しさん [] 2018/11/13(火) 17:46:33.84 ID:/6RlnNZj ところでUTF-8にBOMってなんか意味あるの? ビッグエンディアンで上のビットから詰め込んで並べている1パターンしかないよね? http://mevius.5ch.net/test/read.cgi/tech/1349538519/453
454: デフォルトの名無しさん [sage] 2018/11/13(火) 18:09:12.36 ID:3HdfrOce >>453 あるよ、BOMがあればUTF-8だと文字コードを 簡単に判定できる つまり、文字化け防止に役立つ みんなBOM付けるようにすれば良かったんだけどな http://mevius.5ch.net/test/read.cgi/tech/1349538519/454
455: デフォルトの名無しさん [] 2018/11/13(火) 19:44:37.81 ID:/6RlnNZj あー。magic用か。 http://mevius.5ch.net/test/read.cgi/tech/1349538519/455
456: デフォルトの名無しさん [sage] 2018/11/14(水) 00:34:48.87 ID:efwoHdbt >>450 ですが、改行が入っていました。 遅くなりすみません。 すみませんでした。確認をしっかりします。 もう一つ質問があるのですが、>>450の環境にて、パターンマッチングを、全角、半角、ひらがな、カタカナ、大文字、小文字を区別することなく行いたいのですが、方法をご教示いただけますでしょうか。 http://mevius.5ch.net/test/read.cgi/tech/1349538519/456
457: デフォルトの名無しさん [] 2018/11/14(水) 09:45:09.68 ID:bDqFuzUS >>456 手順としてはまず比較に都合のいいように比較する側とされる側の文字列を正規化する。 例えば半角は全て全角にし、濁点や半濁点はそれを含んだ文字にし、英小文字は大文字にする。 それから比較を行う。 ただし使われている文字がASCIIの文字だけならば // のオプションで i が使えるので正規化不要。 http://mevius.5ch.net/test/read.cgi/tech/1349538519/457
458: デフォルトの名無しさん [sage] 2018/11/14(水) 12:24:46.73 ID:XfG22Q3S 教えて下さい。 my @str4=['a','b','c','d','e']; my $ref4=\@str4; print $str4[0][1],"\n"; # b print @{ $str4[0] },"\n"; # abcde ref4を使って同様に b と abcde を表示するには、どうしたらいいですか? http://mevius.5ch.net/test/read.cgi/tech/1349538519/458
459: デフォルトの名無しさん [sage] 2018/11/14(水) 12:38:11.11 ID:XfG22Q3S うっかり自己解決しました。数時間悩んだのに。 print @{ ${ $ref4 }[0] }; print @{ ${ $ref4 }[0] }[1]; http://mevius.5ch.net/test/read.cgi/tech/1349538519/459
460: デフォルトの名無しさん [sage] 2018/11/14(水) 19:36:24.69 ID:dXHPcciK >>457 オプションで可能であればと思ったのですが、マッチング文字列と対象を同じ文字種にしないといけないんですね。 ActivePerlでUnicode::Japanese でUTF8から変換して書いてみたのですが、cp932にencodeすると、化けてしまい、使用できませんでした。 ActivePerlで使用可能なモジュールあればコードではなくてかまいませんので、何かあれば紹介してもらえますでしょうか。 http://mevius.5ch.net/test/read.cgi/tech/1349538519/460
461: デフォルトの名無しさん [] 2018/11/14(水) 20:41:47.52 ID:bryEJhFF UNICODEにはcomposed、decomposedというややこしいものもあるんだよね。 https://pointoht.ti-da.net/e8205606.html Unicode::Normalizeってのがあるけど、日本語を特別扱いしてくれたりはしなさそうな予感。 http://mevius.5ch.net/test/read.cgi/tech/1349538519/461
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 62 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.014s