iT邦幫忙

0

關於文字資料的調整

ebag 2010-06-11 13:29:096942 瀏覽
  • 分享至 

  • xImage

在「EmEditor」中,如果要將下列文字(數量很多,只摘錄部分而以)
由「A」型態轉成「B」,不知道應該作哪些步驟呢?

漢字日文數字「混搭」的狀態,似乎很複雜...。

「A」狀態

孔庚居こうこうきょ 265 高鴻裁こうこうさい 265硬黄紙こうこうし 265皇輿造像銘こうこうぞうぞうめい 265 孔庚陶こうこうとう 265 黄公望こうこうぼう 265 高肱墓誌こうこうほし 265侯剛墓誌こうごうぽし 266孔康鏡こうこうよう 266 考古図こうこず 266

「B」狀態

孔庚居 こうこうきょ 265
高鴻裁 こうこうさい 265
硬黄紙 こうこうし 265
皇輿造像銘 こうこうぞうぞうめい 265
孔庚陶 こうこうとう 265
黄公望 こうこうぼう 265
高肱墓誌 こうこうほし 265
侯剛墓誌 こうごうぽし 266
孔康鏡 こうこうよう 266
考古図 こうこず 266

PS:三種數列之間的空格為半形(全形亦可)

謝謝!

看更多先前的討論...收起先前的討論...
小成 iT邦高手 10 級 ‧ 2010-06-11 15:14:22 檢舉
我會用笨方法
分兩步驟
1.
搜尋取代
將use regular expressions打勾
搜尋
\d{3}[ ]{0,1}
取代為
\0\n

2.
搜尋取代
將use regular expressions取消
將use escape seqence打勾
然後搜尋(前面一個空格然後\n)
\n
取代為(前面沒有空格)
\n
小成 iT邦高手 10 級 ‧ 2010-06-11 15:14:59 檢舉
呃~前面的空格被弄不見了
還好有附註說明
小成 iT邦高手 10 級 ‧ 2010-06-11 15:16:50 檢舉
突然發現我講的跟你要的有點不同
你的原始資料間有好多沒空格
要變成有空格的捏...
看起來好麻煩= =
小成 iT邦高手 10 級 ‧ 2010-06-11 15:34:03 檢舉
那再加個第三步驟
3.
搜尋取代
將use regular expressions打勾
搜尋
[あ-を]{1,}
取代為(前面有空格,後面再接\0)
\0

只是不知道這樣會不會漏掉XD
fillano iT邦超人 1 級 ‧ 2010-06-11 16:11:33 檢舉
在UltraEdit裡面的話,使用perl格式的re,可以用:
(\d+)\s*
來搜尋,然後取代的話用:
\1\n
就一次完成了。
fillano iT邦超人 1 級 ‧ 2010-06-11 16:13:08 檢舉
疑?這是討論耶,您要不要移到回答去阿?不然發問者會不知道如何結束。
小成 iT邦高手 10 級 ‧ 2010-06-11 16:16:58 檢舉
我都寫在討論的XD~
我只是個小肉腳~
看看有沒有其他人有更厲害的解法
小成 iT邦高手 10 級 ‧ 2010-06-11 16:19:51 檢舉
fillano提到:
在UltraEdit裡面的話,使用perl格式的re,可以用:
檢視原始檔複製到剪貼簿列印關於
(\d+)\s*  
來搜尋,然後取代的話用:
檢視原始檔複製到剪貼簿列印關於
\1\n  
就一次完成了


請教一下
為啥後面的\s*取代後會消失?
fillano iT邦超人 1 級 ‧ 2010-06-11 16:27:39 檢舉
我下載EmEditor來試了一下,看起來搜尋條件:
(\d+)\s*
取代:
\0\n
是可行的。(在UltraEdit要用\1\n)
fillano iT邦超人 1 級 ‧ 2010-06-11 16:34:35 檢舉
esyc提到:
請教一下
為啥後面的\s*取代後會消失?

沒有用back reference阿,所以取代的地方也沒back reference可以用。想照原來保存空格的話,就用:
(\d+)(\s*)
取代:
\1\n\2
由於原資料應該沒辦法用空格為分欄。
所以無法用分欄符號來區別。
若以數字來判斷的話,
卻沒辦法區分什麼是中文、什麼是平假名。
所以關鍵在於怎麼區分中文、平假名。
在 EmEditor 絕對沒辦法做到希望的結果,
只能從程式來判斷中文字碼的範圍、平假名字碼、數字字碼的範圍,
才能把中文、平假名、數字變成分欄的資料。
小成 iT邦高手 10 級 ‧ 2010-06-11 17:46:55 檢舉
OH~對喔XD~
感謝
wordsmith iT邦高手 1 級 ‧ 2010-06-11 18:16:28 檢舉
嗯,應該是可以用unidcoe碼去判斷出日文平假名,像平假名的字碼就落在12353~12435之間(10進位)
ebag iT邦新手 5 級 ‧ 2010-06-11 21:31:21 檢舉
esyc提到:
D~



利用twtw兄的程式

果然就可以完成需要的效果。
原來可能要用一個晚上以上來調整的內容,應該可以快的幾倍了!

這網址希望能一直保有...。
資料都能這樣轉換,就太方便了!

真是感謝twtw兄的程式幫助!
fillano iT邦超人 1 級 ‧ 2010-06-11 21:41:12 檢舉
Big5大概比較難辦,不過EmEditor或是UltraEditor這些編輯器都支援unicode,在unicode的環境下使用RE就不太有問題。

UltraEdit支援三種風格的Regular Expression,其中Perl的底層是用PCRE,也支援[[:unicode:]]。
fillano iT邦超人 1 級 ‧ 2010-06-11 23:05:04 檢舉
看過wordsmith的想法,測試了一下。其實EmEditor或是UltraEdit這兩個支援unicode的編輯器,也同時支援unicode的char range!

利用OpenOffice的「插入」->「特殊字元」可以找到平假名與片假名的字面,平假名第一個是「ぁ」,片假名最後一個是「ヾ」。另外,可以找到「中日韓統一漢字擴充-A」第一個是「㐀」,而「中日韓相容字元」最後一個是「鶴」。所以,ebag的要求可以做到,搜尋用:
([㐀-鶴]+)\s*([ぁ-ヾ]+)\s*(\d+)\s*
取代成:
\1 \2 \3\n
這樣漢字、假名及數字之間會有一個空格,而在數字之後會分行。
fillano iT邦超人 1 級 ‧ 2010-06-11 23:11:40 檢舉
另外,EmEditor的Regular Expression做的不錯,效率比UltraEdit好很多。(最近幾版的UltraEdit搜尋效率都有點差)
wordsmith iT邦高手 1 級 ‧ 2010-06-11 23:13:37 檢舉
讚讚讚
好訝異,竟然可以直接用中日韓字元的範圍來切出辨識,
原來字碼的範圍可用OOo裡的符號功能找出,
就完全只用到編輯器就解決了。讚
上面的一些demo還是前兩年鐵人賽的展示,
基本上就是會一直放在那邊。
ebag iT邦新手 5 級 ‧ 2010-06-12 03:43:56 檢舉
雖然已經是天亮了(在日本)

還剩下十頁還沒轉好,不過網站似乎當了?無法轉了...
ebag iT邦新手 5 級 ‧ 2010-06-12 03:49:44 檢舉
看到了fillano兄的回覆,

原來用EmEditor就可以處理了,太厲害了!
不知道有沒有教學網站,希望在自己的專業研究之餘,
有機會好好的學一下這些資訊邏輯與應用技巧!
看了一下網站,還可以跑;再看一下網站的log檔,
是因為2010-06-12 03:41:40那一次的最後一筆最後面是:
以ほんこんちゆうぶんだいがく為終結,
最後面只要3個數字就跑出來。

因程式只是預設您所輸入一定是中文+平假名+數字的格式,
而完全沒有考慮不符此格式的情況,
所以會出現網頁的錯誤訊息,
但網站並沒有當。
但只要到前一頁,把確認輸入的格式符合以上格式,
就仍能跑下一筆。
再仔細看一下記錄,因您從2010-06-12 03:37:35到2010-06-12 03:41:40,
輸入幾次同樣的內容,所以都同樣的例外錯誤情形,
讓您覺得網站掛。
若有同樣情形,試試看複製貼上的資料少一點,
應就不會又出現同樣錯誤訊息。

另外,若有例外的錯誤情況出現,
把資料分割貼上,來排除可能是哪一部分資料無法轉。

以為網站不能用的情況下,用fillano提供的語法用在EmEditor,
也可順理解決吧?!
ebag iT邦新手 5 級 ‧ 2010-06-12 14:23:11 檢舉


TO twtw兄:

的確,凌晨,最後十頁是利用fillano兄的方法解決的。
網站中:

日文中若有()的部分,下一行的內容會遺失。
日文之間若有「・」日文的前半段部分會遺失。

這也是後來看到的,一個小問題。

利用EmEditor則不會有以上兩點問題,
只有日文的後半段若是「)」作為結束,則這個「)」會遺失。

很感謝大家的的解答!
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

12
逮丸逮丸
iT邦大師 1 級 ‧ 2010-06-11 21:00:15
最佳解答

在討論裡說明了一些可能的解法,
但從現有的 regular expression 無法解決辨識中文、平假名的問題。
用程式去判斷字碼屬於中文或平假名,
是可行的辦法,但從造輪子開始是蠻辛苦。

之前寫 有關 Regular Expression 正則表達式 的粗淺資源介紹 時,
其實是也想把 Oniguruma 介紹一下,
但沒什麼實際使用的經驗,
最多是在用 ultraviolet (在 Highlight 原始碼的方便工具 有提及),
或者要裝 Slide Show (S9) - A Free Web Alternative to PowerPoint and KeyNote in Ruby 套件的時候,
要用到而裝上 Oniguruma 而已。為了解這一題,用心地看了一下 Oniguruma for Ruby 的使用,
果然憑著多語言的 Oniguruma Regular Expressions 可以辨識平假名。

由於輸入的文字檔,是以 「中文、平假名、數字 」 規則地輪替出現,
所以就:
1.截前面屬中文的pattern
2.截剩下最前面的平假名pattern
3.截剩下最前面的數字pattern
4.剩下的,再從 1. 開始做。
其實就是簡單的遞迴做法。

利用了 Ouniguruma,在 ruby 程式語言環境:

<pre class="c" name="code">
require 'oniguruma'
$result = ''
def oneline(str)
  if str.size > 3
    zh_pat = Oniguruma::ORegexp.new('(\P{Hiragana}+)\s?(\p{Hiragana}+.*)','i','utf8')
    matches = zh_pat.match(str)
    zh = matches[1]
    zhs = matches[2]
    jp_pat = Oniguruma::ORegexp.new('(\p{Hiragana}+)\s?(\d+.*)','i','utf8')
    matches2 = jp_pat.match(zhs)
    jp = matches2[1]
    jps = matches2[2]
    int_pat = Oniguruma::ORegexp.new('(\d+)\s?(\P{Hiragana}+.*)','i','utf8')
    unless jps =~ /^\d+$/
      matches3 = int_pat.match(jps)
      int = matches3[1]
      ints = matches3[2]
    else
      int = jps
      ints = ''
    end

    $result += "#{zh} #{jp} #{int}\n"
    oneline(ints)
  end
end

f = File.read('./file.txt')
oneline(f)

其中 \P{Hiragana} 是不合平假名字樣,小寫p 是合的,
match 出來成一 array,0是原整串,1是 back reference 的第一個,以此類推。
所以 zh, jp, int 是截到要的字串,剩下的以 zhs, jps, ints 代入下一個截取。
第4行,是假設最後會剩3個數字,所以只要是輸入的字串大於長度3才執行。
14~21行是剩最後一組數字的判斷,而設可結束遞迴的條件。
不大會說明,但程式碼蠻單純的,看了就理解是在幹什麼。

我將以上的程式碼,
做成線上就可執行:
http://alpha.tagbible.net/zhjp
以補無法在 EmEditor 處理之憾,
只要是符合 中、日、數 的連串文字,
就可排出以空格分欄的結果來。

我要發表回答

立即登入回答