Re: [問題] 長度固定的寫法..(perl/php皆可)

作者: cutecpu (可愛中央處理器)   2011-10-04 10:55:06
#!/usr/bin/perl
while(<DATA>){
# 用 "\t" 補齊結尾後面不足長度的部份
s/^$/"\t" x 39/e;
s/^(.{5})$/$1 . "\t" x 34/e;
s/^(.{11})$/$1 . "\t" x 28/e;
s/^(.{25})$/$1 . "\t" x 14/e;
s/^(.{32})$/$1 . "\t" x 7/e;
# 用 "\t" 代替中間有欄位是空值的部份
s/^ {5}/"\t" x 5/e;
s/^(.{5}) {6}/$1 . "\t" x 6/e;
s/^(.{11}) {14}/$1. "\t" x 14/e;
s/^(.{25}) {7}/$1. "\t" x 7/e;
# 欄位中間加上逗號
s/^(.{5})(.{6})(.{14})(.{7})(.{7})$/$1,$2,$3,$4,$5/;
# 去掉 "\t"
s/\t//g;
# 印出結果
print;
}
__DATA__
123 j12345mc1235987ccccc aaaaxxxxxxx
12345a345cd2187ankjdkj219zxnmzxn2109890
12345a345cd2187ankjdkj219zxnmzxn
12345a345cd2187ankjdkj219
12345a345cd
12345
a345cd 2109890
2187ankjdkj219zxnmzxn
zxnmzxn
※ 引述《squalll (追求夢想~)》之銘言:
: 沒想到還會回來回這一篇....
: 最近才發現這樣寫有些資料有問題
: 因為資料欄位中不一定會有資料,
: 最後一個欄位如果是空白的話這樣輸出就會錯誤
: 12345a345cd2187ankjdkj219zxnmzxn2109890
: 123 j12345mc1235987ccccc aaaaxxxxxxx
: 12344123222 123ascv
: 這樣到第三筆輸出的時候會變得很奇怪
: 預期應該會變成
: 12345,a345cd,2187ankjdkj219,zxnmzxn,2109890
: 123 ,j12345,mc1235987ccccc, aaaa,xxxxxxx
: 12344,123222,,123ascv,
: 但是實際上第三筆資料會變成
: 12344123222,123ascv之類的..
: 我的REGEXP目前是這樣寫
: foreach $thing (@list){
: $thing =~ s/(.{5})(.{6})(.{7})(.{8})(.{9})/$1,$2,$3,$4,$5/;
: ....
: }
: 主要應該是因為s/match一串非空白字元,並以找到的字串為結尾
: 所以當我最後一欄資料為空白的時候就會發生錯誤了
: 不知道有沒有人遇過類似的問題? 該如何解決呢
: 我的資料是連續的..該怎麼寫才可以取出度定長度的值(包含空白)
: 謝謝m(_ _)m
: ※ 引述《squalll (放逐?)》之銘言:
: : 有一堆連續的資料
: : 12345 a345cd 2187ankjdkj219 zxnmzxn 2109890
: : 123 j12345 mc1235987ccccc aaaa xxxxxxx
: : 中間有空白分隔,不過因為長度都固定,想問取固定長度的regular怎麼寫呢
: : 希望能轉換成這樣,第一欄就固定取長度五個,第二欄六個,第三欄14個..之類的!
: : 輸出結果:
: : 12345,a345cd,2187ankjdkj219,zxnmzxn,2109890
: : 123 ,j12345,mc1235987ccccc, aaaa,xxxxxxx
: : 謝謝大家 :)
作者: godspeedlee (妳,我可以)   0000-00-00 00:00:00
假如空白欄位的空白字元長度不定,那這就是解答了不過這要長度不為0的狀況下:P另外,「.」也會match空白字元,您的解法中某些「.」替換成\S比較好喔還有就是「空白的欄位」的數量要等於「空白字元」的數量的情況下您的解法才會成立..^^不過能想到這樣寫也是很厲害~

Links booklink

Contact Us: admin [ a t ] ucptt.com