いずみちゃんどっとこむ プログラミング掲示板

過去ログ一覧

Perl Tips (10)
1 名前:いずみ 投稿日:2001/12/08(土) 04:34:25
 Perl小技のさらしage

2 名前:いずみ 投稿日:2001/12/08(土) 04:42:28
perl CSVをフィールドに切り出す。Macのテキストファイルには対応してないよーん(藁)

while ($buf = <>) {
  $buf =~ s/[\012\015]//g;
  $buf =~ s/"""/"\012/g;
  $buf =~ s/""/\012/g;
  $buf =~ s/(^|,)"([^,"]*),([^,"]*)"($|,)/$1"$2\015$3"$4/g;
  $buf =~ s/(^|,)"([^"]+)"($|,)/$1$2$3/g;
  @field = split(',', $buf);
  for ($i = 0; $i < @field; $i++) {
    $field[$i] =~ tr/\012\015/",/;
    print "<$field[$i]>\n";
  }
}

3 名前:いずみ 投稿日:2001/12/08(土) 14:01:02
 …とこれでよいかと思ったらダメなのね^^;;
 改行がフィールドの途中で入った場合、"でquoteされるという仕様を経験則的に把握。

 とすれば、\rや\nをテンポラリに使うことができないわけで、さぁどうしよう状態か。
 もちろん、先頭から1文字ずつなめていけば簡単にできるのはわかっているので、そうじゃない前提で。

4 名前:ぱーなの〜〜 投稿日:2001/12/13(木) 23:09:26
解決策
1)最適解:CSVヲ使わない。(separatorに,ヲ使うのが間違い)
2)なんだか解:,でsplitして"が偶数個になるようにつなげる。
mapをうまく使えば1行。(中学入試)

5 名前:いずみ 投稿日:2001/12/14(金) 01:23:06
>>4さん:
 ソボクなギモンなのですが、「"が偶数個になる」というのはperlで書けるのでしょうか?(書けそうな気が^^;;)

6 名前:ぱーなの〜〜 投稿日:2001/12/15(土) 01:49:01
0, 1, それ以上は沢山(と書いて無限大と読む)
for$i(0..9){
printf "%2d\t%10s\t%2d\t%2d\n",$i,$_='"'x$i,$c=@_=/"/g,$c%2
}


7 名前:いずみ 投稿日:2001/12/17(月) 01:54:26
 んで、じゃーどーすればよいのでせうか。

 ちょっと考えたのですが、>>4の方針で,「illeagalなデータ」を含むCSVでも誤動作しないようなものは書けるんでしょうか?

#といいつつ、そもそも "line oriented" を前提にする以上、「いかにもperl」(つーの自体もめそーだが)的には書けないんじゃ?つー気も

8 名前:ぱーなの〜〜 投稿日:2001/12/18(火) 16:35:48
「illeagalなデータ」ってなに??
 "やとかコンマや改行含んでるやつ?
  そういうのを、illeagalていうの?
    んで、 illeagalなsexとかあったりするのね。
適切にエスケープされてれば、leagalなんとちゃうの?
あとは、米沢はんの宿題やて...。
基本は"をカウントして、偶数の時だけ、
コンマや改行を堺に、(2次元)配列に分解すればいい。
エスケープ解くのは後回し。
2>>は、先にアンエスケープしちゃうからだめなの。

9 名前:いずみ@インフォシティ 投稿日:2001/12/18(火) 23:14:21
 たとえば、123,4"5"6,7 というのはCSV的には「おかしく」ないですか?
 いずれにせよ、12月8日以降(激藁)この問題は優先順位が下がってるので後回しっと。

10 名前:ぱーなの〜〜 投稿日:2001/12/19(水) 01:16:15
illeagalでもrationalであれば問題ないんでない?そのファイルに
consistencyがあるかどうかね。leagalでもirratinalなものが威
張ってるから大問題なんやけど、CSVもどきに関していえば、ど
んなデータかによるやろね。数値だけとかなら、何も問題ないけ
ど、世のなかには、一般の文字列データを、単純に,で挟んでCSV
して、あとで泣いてるお馬鹿さん一杯いるみたい。あ、泉はんのこ
とちゃうって。要は、一意的に元データを復元できるかどうかで、
illeagalかどうかではないやわ。

Script: mjuz float bbs ver.1.32