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

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ってのがあるけど、日本語を特別扱いしてくれたりはしなさそうな予感。
462
(2): 2018/11/14(水)22:57 ID:otO/yyOk(1/2) AAS
>>453-455
Linux では、BOM なしUTF-8 を使う、アプリ開発者が多く、
BOMありにするとバグるアプリがあるから、BOMなしを使っているけど、

そうすると、Windows では、sjis と区別がつかなくなり、
Explorer での文字列検索ができなくなる

だから、Windows10 で、WSL, Ubuntu を導入して、grep を使っている
463: 462 2018/11/14(水)23:51 ID:otO/yyOk(2/2) AAS
結合文字列をUnicode正規化で合成する方法の危険性
外部リンク:qiita.com

濁点・半濁点を別の1文字として扱う、結合文字列はMac だけだから、Mac を使わないなら関係ない

Unicode正規化は、日中韓で、別の漢字に変換されるものがあるから使えない

Ruby では、sjis・UTF-8 の変換は、ファイル読み書き時に指定できる。

CRLF・LF の改行コードの違いは、意識したことがない。
chomp とか、どちらの改行コードでも、正常に動く
464
(1): 462 2018/11/15(木)00:11 ID:g74yzjtM(1) AAS
【 nkf 】コマンド――文字コードと改行コードを変換する
外部リンク[html]:www.atmarkit.co.jp

これで全角・半角の変換もできる

Perl にも、モジュールもあるのでは?
1-
あと 59 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.012s