fc2ブログ
InDesign居残り補習室

どれだけ勉強しても上達しない管理人の、InDesign備忘録を中心に。たまにブックレビューなども。

作業メモ:テキスト処理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


スポンサーサイト



いろいろな書き方があるのだと思いますが、
検索置換で書くならこんな感じで書くかなぁ。。。

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

いつもありがとうございます(^^)

またまた悪い癖が出てしまいました。
\tをターゲットに置換しておいて、戻し置換。
一発で置換するつもりのないスクリプトですね(苦笑)

\sですか。空白文字、なるほど~。
せっかくruby使うんだから便利なものは使わなきゃ、ですね。

¥sはperlと同じなんだと思います。
気をつけなくちゃいけないのは、改行文字も含んでしまうこと。

はじめまして。正規表現を使わないとこんな感じでしょうか。

#!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行目)は結果が同じになりませんが。

>> せうぞーさん
空白、タブ、改行、改頁とマッチですね。使う時には気をつけます。

>> kawauchiさん
はじめまして。御指南ありがとうございます。
そうか、¥tで分解して配列に入れてしまうのですね。

> フィールドが6つある行(3行目)は結果が同じになりませんが。

すみません、サンプルテキストの入力ミスです(^^;
実際に仕事で使った処理対象テキストでは、6つ目のフィールドはありません。

このブログの記事のタイトルは「テキスト処理2」ということなので、
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行めの全角スペースはデータの一部ということでいいんですよね。

タブの両側にある半角スペースはデータの一部でしょうか? 私、消しちゃいましたけど。

[]は全角でいいですよね?

あ、またやってしまった。?n と ?t は半角の ¥n と ¥t です。

fourさん、perlのご指導も大歓迎です。
というか、教えてください(笑)

> 9行めの全角スペース
仕事で使ったデータには、空白フィールドもなくって、コメント行以外のセルにはすべてデータが入っています。
これはサンプルなので、全角スペースが混じってたらどうなるかなー、なんて(苦笑)
なんだかわかりづらくしちゃいましたね、すみません。

> タブの両側にある半角スペース
これはサンプル(ry
見やすくするためにワザとスペースいれてみました。不要です。

> []は全角でいいですよね?
そうです。全角です。

コメントの投稿





管理者にだけ表示を許可する

トラックバック

http://kstation2.blog10.fc2.com/tb.php/36-ee34d249

Rubyによる文字列処理リファクタリング工房

一時期はてな [www.hatena.ne.jp] を中心として巻き起こった Perl スクリプトのリファクタリング [b.hatena.ne.jp] ブームが今になって DTP の世界にやってきたようです。 InDesign居残り補習室 作業メモ:テキスト処理1 [kstation2.blog10.fc2.com] InDesign居残り補習室

(新しい記事)← 算用数字を1桁全角/2桁以上半角に
作業メモ:テキスト処理1 →(古い記事)

 | HOME | 

カレンダー

04 | 2023/05 | 06
- 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 - - -

FC2カウンター

2006年3月28日カウント開始

Amazon

FC2 Affiliate

動くPDF

プロフィール

あわせて読みたい

あわせて読みたいブログパーツ

最近の記事

最近のコメント

最近のトラックバック

Lc.ツリーリンク

RSSリンク

直感カテゴリーツリーV1.1

ブログ内検索

ブロとも一覧

marumi

神楽崎 ゆう


■ ブログ名:I'm writing NOVEL

七篠 銀字


■ ブログ名:風と夜空と氷の国

MS


■ ブログ名:へなちょこDTP

桜桃


■ ブログ名:追憶の桜吹雪

瑪瑙 輝遊


■ ブログ名:千里の道も一歩から

magatu


■ ブログ名:unsigned

暁 鷲 (あかつき しゅう)


■ ブログ名:空を裂け!

NewMark

C-Roll