いずみちゃんどっとこむ プログラミング掲示板
過去ログ一覧
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