作業メモ:テキスト処理2 2006/05/16
1レコードあたり5フィールドのデータで、原則として空のフィールドはない。
ただし例外としてコメント行がある。
コメント行は第2フィールドのみにデータが入力されており、他の4つのフィールドは空である。
今回施したい処理は以下の通り。
フィールド内のデータは左から順に
1[data]2[data]3[data]4[data]5[data]
という形に囲み、フィールドセパレータのタブは削除。
コメント行はタブのみを削除したい。
処理対象テキストのサンプル
1 ¥t hoge ¥t hage ¥t iki ¥t osu
¥t ※コメント行は第2フィールドのみ ¥t ¥t ¥t
2 ¥t too ¥t yama ¥t no ¥t kin ¥t san
3 ¥t hoge ¥t hage ¥t kik ¥t osu
4 ¥t too ¥t yama no ¥t kin ¥t san
5 ¥t mito ¥t kou ¥t mon ¥t inrou
6 ¥t foo ¥t bar bar ¥t hage ¥t ikk
7 ¥t uge ¥t age ¥t iik ¥t osu
8 ¥t foo ¥t bar bar ¥t kii ¥t hoge
9 ¥t ¥t 日 ¥t 本 ¥t 語
¥t ※コメント行は複数行にわたることもある。 ¥t ¥t ¥t
¥t ※原則として空行はない。 ¥t ¥t ¥t
10 ¥t guge ¥t mage ¥t kki ¥t osu
rubyスクリプトはこれ
#usr/bin/ruby
while line = ARGF.gets
line.sub!(/^/) {"1["}
line.sub!(/¥t/) {"]2["}
line.sub!(/¥t/) {"]3["}
line.sub!(/¥t/) {"]4["}
line.sub!(/¥t/) {"]5["}
line.sub!(/$/) {"]"}
line.gsub!(/(1[]2[|]3[]4[]5[])/) {""}
print line
end
またまた悪い癖が出てしまいました。
\tをターゲットに置換しておいて、戻し置換。
一発で置換するつもりのないスクリプトですね(苦笑)
\sですか。空白文字、なるほど~。
せっかくruby使うんだから便利なものは使わなきゃ、ですね。
気をつけなくちゃいけないのは、改行文字も含んでしまうこと。
#!usr/bin/ruby -Ks
while line = ARGF.gets
ary = line.chop.split("\t")
puts (ary.first == "" ? ary : "12345".split("").zip(ary).map{|i| i[0] + "["+ i[1] +"]"}).join
end
フィールドが6つある行(3行目)は結果が同じになりませんが。
空白、タブ、改行、改頁とマッチですね。使う時には気をつけます。
はじめまして。御指南ありがとうございます。
そうか、¥tで分解して配列に入れてしまうのですね。
> フィールドが6つある行(3行目)は結果が同じになりませんが。
すみません、サンプルテキストの入力ミスです(^^;
実際に仕事で使った処理対象テキストでは、6つ目のフィールドはありません。
Perl で書いたものを参加させてください! さみちいよ~(泣)
ちょっと行数あるけど、これならフィールドが10でも、20でも、100個あっても対応できます。そんなことは求められていないか(^^;
#!/usr/bin/perl
use strict;
use utf8;
binmode(STDOUT, ":utf8");
open (IN, "<$ARGV[0]"); binmode(IN, ":utf8");
my $c;
while( defined(my $line = <IN>) ){
$c = 0;
chomp $line;
$line =~ s/( *(?t|$) *)/?t/g;
if($line =~ /^?t?t*/){
$line =~ s/?t//g;
}else{
$line =~ s/?t*(.*?)(?t|$)/add($1)/ge;
}
print "$line?n";
}
close IN;
sub add{
my $str = shift;
++$c;
if($str eq ''){return ''}
return "$c[$str]";
}
>原則として空のフィールドはない。
ということですが、9行めの全角スペースはデータの一部ということでいいんですよね。
タブの両側にある半角スペースはデータの一部でしょうか? 私、消しちゃいましたけど。
[]は全角でいいですよね?
というか、教えてください(笑)
> 9行めの全角スペース
仕事で使ったデータには、空白フィールドもなくって、コメント行以外のセルにはすべてデータが入っています。
これはサンプルなので、全角スペースが混じってたらどうなるかなー、なんて(苦笑)
なんだかわかりづらくしちゃいましたね、すみません。
> タブの両側にある半角スペース
これはサンプル(ry
見やすくするためにワザとスペースいれてみました。不要です。
> []は全角でいいですよね?
そうです。全角です。
コメントの投稿
トラックバック
http://kstation2.blog10.fc2.com/tb.php/36-ee34d249
検索置換で書くならこんな感じで書くかなぁ。。。
while line = ARGF.gets
line.sub!(/^\s+([^\s]+)[\t ]+/) {"#{$1}"}
line.sub!(/^([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t\r\n]+)/) {"1[#{$1}]2[#{$2}]3[#{$3}]4[#{$4}]5[#{$5}]"}
print line
end