スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
CSVファイルからの抽出
Perlにはリストコンテキストがあるから ,(コンマ)の数が、というかデータの数が違っても簡単に取り出せたのか・・・

data.txt

aaaaa, 1, あああ
bbbbb, 2
ccccc, 3, dsss, wwww
eeeee, 4
addd, qwqqq, aaaaabb



use strict;

open(my $file, './data.txt') || die "data.txt: $!";

while(my $line = <$file>) {
chomp $line;
my @hoge = split(/,\s*/, $line); #リストコンテキストの力
print "@hoge\n";
}
この程度なら参照物なしで、1分以内に書けないと仕事にならん気配がするorz


同じ出力結果になるようにJavaで書いてみた・・・
import java.io.*;
import java.util.regex.Pattern;

public class Hoge {

/**
* @param args
*/
public static void main(String[] args) {
String[] msg = new String[100];
int i = 0;

try{
BufferedReader in = new BufferedReader(
new InputStreamReader(
new FileInputStream("data.txt"),"MS932"));
while((msg[i] = in.readLine()) != null){
Pattern ptn = Pattern.compile(",\\s*");
String[] data = ptn.split(msg[i]);
for(int j=0; j < data.length; j++){
System.out.print(data[j] + ' ');
}
i++;
System.out.println();
}
in.close();
}catch (Exception e) {
e.printStackTrace();
}
}

}
Listを使うともっときれいになるかも。。。。


というか Perl にせよ Java にせよ、俺のプログラムなんて、、、、orz
スポンサーサイト
もう 欲張りなんだからぁ
Perlの正規表現は欲張りである。

ということで 「初めてのPerl」と「Learning Perl」でコピペまでして使いなさいと書かれているあの大切な摩訶不思議なテストスクリプトが英語のページじゃないと発見できないので ここに貼っときます。

($`) ($&) ($')

ですね。

今回、正規表現を使って ちょっとHTMLのタグの数を確認してみたいと思った。 どうも divタグを閉じすぎのような気がした・・・・

ということで 以下のスクリプトを書いてみました。
参考資料:
http://stein.cshl.org/genome_informatics/regex/regex4.html


#################################################################
#!/usr/bin/perl
use strict;
use warnings;

my $file = shift @ARGV;
open(IN, "<$file");
my @lines = <IN>;
close(IN);

my $count_hiraku = 0;
my $count_tojiru = 0;

foreach my $line (@lines){
while( $line =~ m/<div.*?>/gc ){
print "($`) ($&) ($')\n";
$count_hiraku++;
}

while( $line =~ m|</div>|gc){
print "($`) ($&) ($')\n";
$count_tojiru++;
}
}

print "$count_hiraku ===?=== $count_tojiru\n";
#################################################################



説明:
正規表現であるが .* で任意の文字に0文字以上マッチするであるが、
これだと「欲張り」なので ? をつけてやる。つまり、 .*? で「欲張り」でなくなる!! こりゃすごい 「」 すごいぞ!!!

そして while( $line =~ m/<div.*?>/gc ) のところであるが、
はじめ、 if( $line =~ m/<div.*?>/ ) にしていたのだが、これだと $line に 複数の divタグがあったときカウントしすごすと思い、 g で「1つマッチしてもやめず最後までやる」 ということを促し、 c で 「マッチに失敗した後、位置をリセットしないようにする」と 促してやった。 


さて、さらに
参考資料:
http://blog.so-net.ne.jp/tink/
を 参考にさせてもらうと もっと短くソースが書けるようなので、(どこまで短くするかについては色々意見があると思いますが)「続きを読む」に 残り2パターンを載せておきます。

あ、あと 上のスクリプトは たぶん正しいはずです。。。
バグ報告あればよろしくお願いします。
自分に要る機能だけperl2html.pl
ちょっとネットに上げていただいているのは、機能が多いので、練習もかねて自分に要る機能をもった perl2html を作りました。

要は、perlで書いたソースをhtmlでページに載せたいんだけど、
< > が タグと認識されてうまくページに載せれない そんなときに 使えます。

使い方:
main_myperl2html.pl に コマンドプロンプトで 変換したいperlスクリプトを引数に与えると カレントディレクトリに 同じ名前に hoge.html となった HTMLファイルが作成される。

なお、このコードは sjisで書かれています。環境に合わせてください。

ダウンロードは 以下より、
http://ideon.dyndns.org/~naka/perl2html/myperl2html.lzh


なお、「続きを読む」にソースを貼っておきます。

参考資料:
http://homepage3.nifty.com/Nowral/22_PrettyPrinter/22_PPP.html
http://www.imymode.com/lab/keiji03.htm

ちなみに今回 死ぬほど苦戦してしまったのが 配列とファイルハンドルの処理をごっちゃにしてしまっていたこと。。。。

つまり、

foreach(@array){
なにか処理;
}

とすべきところを、

while(<@array>){
なにか処理;
}

としてしまっていたのだ。
< >を使いたかったのなら while( <IN> ) とすべきだったのだろう(ここではINをファイルハンドルとする)。
皆で越えよう正規表現 (Perl編)
最近、僕の周りでPerlを使う人が増えてきてうれしい限りです。

今回は、正規表現とPerlの特性について木村氏とメッセでやりとり(解説)
したことを載せます。

CGIプログラムを始めて

s/aaaa/bbbb/g

if(/aaaa/){  }

$_



なんて形を見たけど こいつらって一体なんなの??
という方でチャット形式の文章を読める根性のある方、読んでください。

実は、正規表現を理解する前にPerlの特性について理解しないといけないことが
あります。どこがPerlでどこが正規表現か理解することが大切です。

正規表現を説明されている多くのページを読む前に知っておかなければ
ならないことをココに載せたつもりです。ということで実は正規表現の説明は
ほとんどココではあらわれません。もし、他のページで正規表現を学ぼうとして
なんかそれ以前の段階でつまってるなぁという方に是非読んでいただきたい内容にしました。

なお、僕は「はじめてのPerl」という有名な書物をもうすぐ読み終わる程度なので、
以下の文章は少なからず間違いを含んでいると思います。

この記事を書くにあたって気づいたところは(注意: )という形で
注意書きを入れておきました。

厳密に知りたいのなら(注意: )の部分には目を通してほしいところですが、わかりやすい説明を望むなら(注意: )は読み飛ばして下さい。


なお、「はじめてのPerl」は是非読みましょう:-)


以下、ビンゴ(解説は緑) 木村(聞き手は青)となっています。
全部読むのに30分ぐらいと言ったところでしょうか。
では、メッセンジャー上でのPerlによる正規表現のレクチャーをお楽しみください。


文字列処理はPerlが他の言語より凄いよ。という説得から始まってます。

ブログ検索

プロフィール

ビンゴ中西
Perlが好きである。
プログラミング言語のほとんどは独学。独学の過程で多くのプログラム仲間にも色々教わりました。

FC2カウンター

カレンダー

07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -

ブロとも申請フォーム

この人とブロともになる

| ホーム |
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。