Perl初心者スレ(マジレス回答) (523レス)
1-

432
(1): 2018/08/05(日)07:50 ID:cdvogGHQ(3/4) AAS
>>428
ところで元のプログラムに「16進バイナリデータを・・・」というコメントが入っているのだろうが、呼び出す側は実際には何を渡している?

仮に元がバイナリだったとしても unpack('N', ...) のようなことをしていない? だとするとそこでバイナリから Perl の
変数への変換自体は終わっている。

つまり、コメントが紛らわしい表現になっているだけ。
433
(1): 427です これは書けるかな? 2018/08/05(日)12:21 ID:gWGunr7x(1/2) AAS
>430-432 スミマセンです。 orz
もっと詳しく書こうとするとマンゴースレでもブロックされました。
ぶっちゃけ、この中の
外部リンク[zip]:motor.geocities.jp
「dc10mov2csv.pl」内です。

gps_data{'latitude'}の部分からです

gps_data{'bearing'}の式は
変換が単精度浮動小数点数(float)のIEEE754 単精度float変換で合ってますか?

これをベースに別メーカー機種の同様な構造を持つデータでの他言語の変換プログラムを考えているので。
434
(1): 2018/08/05(日)17:23 ID:cdvogGHQ(4/4) AAS
>>433
pack, unpack の f は機種依存なので IEEE 754 単制度になるかどうかはプログラムからだけではわからない。
外部リンク:perldoc.jp
まあでも今時の普通のPC用Perlならなってそうな気がするけどね。

latitude って緯度か。GPSデータのバイナリをPerlの変数に入れているということだな。
だから下2桁を60進法で考える必要があると。

やはりそのプログラムのコメントは紛らわしいってだけだよ(サブルーチン名も紛らわしいが)。
bin_convert 呼ぶときには既にバイナリから float に unpack されてるから。
で、bin_convert 内でやっているのは先に書いた通り下2桁を60進法で小数点以下の値にしてるってことね。
435: 427です 2018/08/05(日)21:57 ID:gWGunr7x(2/2) AAS
>>434
ありがとうございます。
全体からずらして抜いたもの60進法にしてるだけなんですね。
てっきりバイナリから浮動小数点を出す特殊計算かと思っていました。
適当にがんばります。
436: 2018/10/05(金)20:29 ID:ZpFL29Ml(1) AAS
「サンプル」の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
437: 2018/10/05(金)21:39 ID:liWk4NPs(1) AAS
まずは自分で書いてみたコードを晒すところからだな。
438
(2): 2018/10/05(金)22:57 ID:kjx9soPU(1) AAS
一行プログラムが思い浮かんだ。

最初の列をハッシュのキーにして3列目をpush。
全部読んだらキーをソートして読んだ内容に番号降りつつ出力。

しかし俺は今電車の中からスマホで書いてるのでここに書く気が起きない。
439
(1): 2018/10/06(土)00:22 ID:mGKg2bAW(1) AAS
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
440: 2018/10/06(土)02:20 ID:m3dYH3N7(1) AAS
考え方は >>439 と同じ

perl -pe "s/^([^,]+,)[^,]+/$1.++$count{$1}/e" < sample.csv
441: 2018/10/06(土)03:33 ID:gPBhgV7B(1) AAS
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);
}
ウチでやるならこうかしら
442: 438 2018/10/06(土)06:07 ID:J8Y2BFN6(1/2) AAS
おはよう。

元のテキストが 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
443: 438 2018/10/06(土)06:21 ID:J8Y2BFN6(2/2) AAS
あ、そうか。貯め込む必要はなくてハッシュ作ってそのまんま出せば良いんだよな。

じゃあawkの方が楽ではないか?

awk -F, 'BEGIN{OFS=","}{n[$1]++;print $1,n[$1],$3}' s.txt
444: 2018/10/06(土)17:28 ID:MMGbFZjG(1) AAS
436です。皆様ありがとうございました。
自分では1行ずつ処理することまでしかできず、複数レコードの
1コラム目の比較をすることができませんでした。
おかげさまで体育の日に子供の運動会に行けます!
ありがとうございました!
445: 2018/11/11(日)14:10 ID:eqm/EHYd(1/2) AAS
上の方のレスにも関連したものがありますが、
ファイルから読み込んだ文字列データにて
パターンマッチがヒットしません。
同一文字列を直接コード内に定義すると、ヒットします。

出来ればファイルに切り出したいので、
ご教示いただけますでしょうか。
446
(1): 2018/11/11(日)14:11 ID:eqm/EHYd(2/2) AAS
[環境]
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
447: 2018/11/11(日)16:14 ID:56YuZzmp(1) AAS
>>446
改行文字の有無?
448: 2018/11/11(日)18:17 ID:t5AG7sJB(1) AAS
たぶんそれだな。$line の中身が "テスト\r\n" または "テスト\n" になってそう。
449: 2018/11/12(月)00:16 ID:MtlIUxHY(1) AAS
chomp($line); するべき
450
(2): 2018/11/12(月)07:45 ID:8fj5l105(1) AAS
遅くなりすみません。
テストファイルには改行を入れていなかったのですが、
chompが必要なのですね。
ファイルからレコードを取得するにはchompが必要と勉強になりました。
ありがとうございました。
451: 2018/11/12(月)09:22 ID:I5PkaEyl(1) AAS
>>450
いや、改行は入っていると思うぞ。でなければあのプログラムでは一致する。
452: 2018/11/13(火)17:15 ID:WOZg75XW(1) AAS
utf-8がボムがついている可能性もあるね
453
(2): 2018/11/13(火)17:46 ID:/6RlnNZj(1/2) AAS
ところでUTF-8にBOMってなんか意味あるの?
ビッグエンディアンで上のビットから詰め込んで並べている1パターンしかないよね?
454
(1): 2018/11/13(火)18:09 ID:3HdfrOce(1) AAS
>>453
あるよ、BOMがあればUTF-8だと文字コードを
簡単に判定できる

つまり、文字化け防止に役立つ
みんなBOM付けるようにすれば良かったんだけどな
455
(1): 2018/11/13(火)19:44 ID:/6RlnNZj(2/2) AAS
あー。magic用か。
456
(1): 2018/11/14(水)00:34 ID:efwoHdbt(1) AAS
>>450
ですが、改行が入っていました。
遅くなりすみません。
すみませんでした。確認をしっかりします。

もう一つ質問があるのですが、>>450の環境にて、パターンマッチングを、全角、半角、ひらがな、カタカナ、大文字、小文字を区別することなく行いたいのですが、方法をご教示いただけますでしょうか。
457
(1): 2018/11/14(水)09:45 ID:bDqFuzUS(1) AAS
>>456
手順としてはまず比較に都合のいいように比較する側とされる側の文字列を正規化する。
例えば半角は全て全角にし、濁点や半濁点はそれを含んだ文字にし、英小文字は大文字にする。
それから比較を行う。

ただし使われている文字がASCIIの文字だけならば // のオプションで i が使えるので正規化不要。
458: 2018/11/14(水)12:24 ID:XfG22Q3S(1/2) AAS
教えて下さい。

my @str4=['a','b','c','d','e'];
my $ref4=\@str4;

print $str4[0][1],"\n"; # b
print @{ $str4[0] },"\n"; # abcde

ref4を使って同様に b と abcde を表示するには、どうしたらいいですか?
459: 2018/11/14(水)12:38 ID:XfG22Q3S(2/2) AAS
うっかり自己解決しました。数時間悩んだのに。
print @{ ${ $ref4 }[0] };
print @{ ${ $ref4 }[0] }[1];
460: 2018/11/14(水)19:36 ID:dXHPcciK(1) AAS
>>457
オプションで可能であればと思ったのですが、マッチング文字列と対象を同じ文字種にしないといけないんですね。
ActivePerlでUnicode::Japanese
でUTF8から変換して書いてみたのですが、cp932にencodeすると、化けてしまい、使用できませんでした。
ActivePerlで使用可能なモジュールあればコードではなくてかまいませんので、何かあれば紹介してもらえますでしょうか。
461: 2018/11/14(水)20:41 ID:bryEJhFF(1) AAS
UNICODEにはcomposed、decomposedというややこしいものもあるんだよね。
外部リンク[html]:pointoht.ti-da.net
Unicode::Normalizeってのがあるけど、日本語を特別扱いしてくれたりはしなさそうな予感。
1-
あと 62 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.011s