討論區快速選單
知識庫快速選單
傑米的攝影旅遊筆記 想要資料分析就學Python 程式設計俱樂部Facebook粉絲團
[ 回上頁 ] [ 討論區發言規則 ]
以VBScript取Text file 中文及英文資料問題
更改我的閱讀文章字型大小
作者 : candyliu(Candy)
[ 貼文 5 | 人氣 2664 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/17 下午 10:04:08
請問各位大大,
如我有一個文字檔(.txt), 其內容如下:
1 5 13 43
0001王小明 台北市忠孝東路三段12號 0287878787
0002張小寶 台北市民生東路一段7號3樓 0225123456
0003W.E.N 台北市敦化北路108號之4 0225148956
............

而我僅知道每一行資料的規則為:
第1~4碼(共4碼): 員工編號
第5~12碼(共8碼): 員工姓名
第13~42碼(共30碼): 地址
第43~52碼(共10碼): 電話

今天我要用VB Script一一將四組資料分開, 分別存入四個不同的table field F1, F2, F3, F4.
正常來說, 一般最直覺的方法就是:
將一行資料讀入變數 tmp然後用下列指令取得四組資料
F1=Mid(tmp,1,4)
F2=Mid(tmp,5,8)
F3=Mid(tmp,13,30)
F4=Mid(tmp,43,10)

但由於Mid不會分變中文佔兩個byte, 而英文只佔一個byte. 四行的 F1, F2, F3, F4 會變成:
tmp="0001王小明 台北市忠孝東路三段12號 0287878787"
F1=Mid(tmp,1,4)="0001"
F2=Mid(tmp,5,8)="王小明 台北市"
F3=Mid(tmp,13,30)="忠孝東路三段12號 0287878787 "
F4=Mid(tmp,43,10)=" "
tmp="0002張小寶 台北市民生東路一段7號3樓 0225123456"
F1=Mid(tmp,1,4)="0002"
F2=Mid(tmp,5,8)="張小寶 台北市"
F3=Mid(tmp,13,30)="民生東路一段7號3樓 02251234"
F4=Mid(tmp,43,10)="56 "
tmp="0003W.E.N 台北市敦化北路108號之4 0225148956"
F1=Mid(tmp,1,4)="0003"
F2=Mid(tmp,5,8)="W.E.N "
F3=Mid(tmp,13,30)="台北市敦化北路108號之4 022514895"
F4=Mid(tmp,43,10)="6 "
但我要的是化能自動判斷是中文或全形字就該佔兩個bytes, 是英文或半形數字就只佔一個byte.
我希望的結果應該為: (以第一行資料為例)
tmp="0001王小明 台北市忠孝東路三段12號 0287878787"
F1=(tmp,1,4)="0001"
F2=(tmp,5,8)="王小明 "
F3=(tmp,13,30)="台北市忠孝東路三段12號 "
F4=(tmp,43,10)="0287878787"
tmp="0002張小寶 台北市民生東路一段7號3樓 0225123456"
F1=(tmp,1,4)="0002"
F2=(tmp,5,8)="張小寶 "
F3=(tmp,13,30)="台北市民生東路一段7號3樓 "
F4=(tmp,43,10)="0225123456"
tmp="0003W.E.N 台北市敦化北路108號之4 0225148956"
F1=(tmp,1,4)="0003"
F2=(tmp,5,8)="W.E.N "
F3=(tmp,13,30)="台北市敦化北路108號之4 "
F4=(tmp,43,10)="0225148956"
請問有什麼function或method或要怎麼寫程式該他能判別中文一個字就該算兩位, 是英文一個字就只算1位, 而不是英文字一個字是 1 位, 而中文字一個字也是 1位???
作者 : chen06043826(羅蘋) Java Script優秀好手貼文超過500則
[ 貼文 813 | 人氣 2644 | 評價 1550 | 評價/貼文 1.91 | 送出評價 11 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/18 下午 02:21:21
請問「員工姓名」及「地址」的碼是如何計算?
作者 : candyliu(Candy)
[ 貼文 5 | 人氣 2664 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/19 上午 09:00:38
員工姓名共8碼, 地址共30碼, 可能會有中文, 也可能有英文, 也會有中英文夾雜的情形.
如果是中文, 一個字要佔兩碼, 如果是英文, 則一個字佔一碼.
現在重點是, VB Script 中, 不管是Mid, MidB, Left, LeftB, Right, RightB, 只要是一個字, 不管中文還是英文, 都佔一樣的一碼或兩碼. 這樣就無法正確的切割.

所以, 請求各位高手, 有沒有什麼辦法可解的?
作者 : chen06043826(羅蘋) Java Script優秀好手貼文超過500則
[ 貼文 813 | 人氣 2644 | 評價 1550 | 評價/貼文 1.91 | 送出評價 11 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/19 下午 06:33:26
我還是不知道為什麼「王小明」會算是八碼.,而不是六碼...@@"
您可以試試這樣:
If tmp = (中文) Then
    F2=Mid(tmp, 5, 8 / 2) ' 以 F2 為例
Else
F2=Mid(tmp,5,8)
End If
作者 : chen06043826(羅蘋) Java Script優秀好手貼文超過500則
[ 貼文 813 | 人氣 2644 | 評價 1550 | 評價/貼文 1.91 | 送出評價 11 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/19 下午 07:06:51
呃,Sorry, 並不是那麼簡單...
希望明天睡醒能有更好的方法...
作者 : ziyuefan(紫曰)
[ 貼文 160 | 人氣 375 | 評價 800 | 評價/貼文 5 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/6/8 上午 12:11:11
既然你說的那些函式的判斷結果是這樣,那 Instr 應該也不例外吧
用 ; 或 空白 當作關鍵字作 分隔吧
喔! 對了~ 好像有個函式叫做 spilit() 的吧,這個應該會更快,但素我忘記怎麼用了
作者 : ziyuefan(紫曰)
[ 貼文 160 | 人氣 375 | 評價 800 | 評價/貼文 5 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/6/8 上午 12:32:45
<script language="VBScript" Type="text/VBScript">
A = "0001 王大明 男 123456 亞特蘭提斯路17-100號"

eachitem = split(A,chr(32))

For each c in Eachitem
document.write c & "<br>"
Next
</script>
作者 : chen06043826(羅蘋) Java Script優秀好手貼文超過500則
[ 貼文 813 | 人氣 2644 | 評價 1550 | 評價/貼文 1.91 | 送出評價 11 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/6/8 下午 08:55:54
嗯,不錯的方法。
但原題中,員工編號與員工姓名間並沒有空格...
作者 : ziyuefan(紫曰)
[ 貼文 160 | 人氣 375 | 評價 800 | 評價/貼文 5 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/6/9 上午 04:22:05

>嗯,不錯的方法。
>但原題中,員工編號與員工姓名間並沒有空格...

那你覺得編號與姓名連在一起甘好 ??
資料結構是可以再安排的...

除非... 資料來源的格式無法由他決定
作者 : carriemis(黑天黑地)
[ 貼文 71 | 人氣 1091 | 評價 130 | 評價/貼文 1.83 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/6/9 下午 02:43:06
有一個方法提供參考:
1. 寫一個Function, 傳入所要讀取的字串, 與所要讀取的位元數
Function ReadData(strLine, intX)
  intY = 0
  For i = 1 To Len(strLine)
     strWord = mId(strLine, i, 1)
     strWord = Asc(strWord )
     If strWord < 128 And strWord > 0 Then '為半形字
     intY = intY + 1
     Else
intY = intY + 2
     End If
     If intY >= intX Then
     ReadData = mId(strLine, 1, i)
     Exit For
     End If
  Next
End Function

ex:
? ReadData("A3程式設計俱樂部",5)
A3程式
? ReadData("A3程式設計俱樂部",6)
A3程式
? ReadData("A3程式設計俱樂部",8)
A3程式設
作者 : chen06043826(羅蘋) Java Script優秀好手貼文超過500則
[ 貼文 813 | 人氣 2644 | 評價 1550 | 評價/貼文 1.91 | 送出評價 11 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/6/9 下午 07:00:01
啊哈,黑天黑地兄您寫出來啦!這程式我想了好久都想不出來說...呵呵,頭腦有問題...

當然,用紫曰兄的方法是較好啦...畢竟各項資料間本來就應該有空格了。
作者 : ziyuefan(紫曰)
[ 貼文 160 | 人氣 375 | 評價 800 | 評價/貼文 5 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/6/10 下午 06:52:58
>當然,用紫曰兄的方法是較好啦...畢竟各項資料間本來就應該有空格了。

我的想法是....
要不就是每個欄位都沒有空格,用第一行定義的欄位長度來讀取(用 Type 定義結構來做)
再要不就是每個欄位都要有分隔字串(不一定只有一個BYTE)

但素,我自己比較喜歡下面這種做法( 用split(readline(),'=') 配合 trim 來做
[Begin]
name = Bill Gates
sexy = female
birthday = 3000/12/32
address = white house
phone = 119
state = TW
[End]

或者

[Begin]
Bill Gates
female
3000/12/32
white house
119
TW
[End]

紀錄與紀錄之間是以 [Begin] [End] 來分隔,當然你也可以自訂
欄位與欄位之間是以 CRLF 字元來分隔(就是一欄就一行拉)
這樣我就允許任何字元了

第一種做法是既然有欄名,所以順序顛倒也沒關係
第二種做法沒有欄名,所以必須按照順序
但是第二種做法比較好做,因為我偷懶..cc

作者 : joyhuang(joy)
[ 貼文 44 | 人氣 2684 | 評價 90 | 評價/貼文 2.05 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/7/15 下午 05:21:14
例:
CUSTID = StrAfterConv(strData, 1, 10) '客戶ID

'資料轉換計算位元組方式,取得固定位元組後再復原
'isStr 處理的字串
'isBegin 開始位置
'isEnd 結束位置
Public Function StrAfterConv(isStr As String, isBegin As Integer, isEnd As Integer) As String
   StrAfterConv = StrConv(MidB(StrConv(isStr, vbFromUnicode), isBegin, isEnd), vbUnicode)
End Function

參考看看吧......
作者 : beckyng(beckyng)
[ 貼文 1 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/9/20 下午 02:17:37
最好的方法, 用EXCEL OPEN 妳的Text file, Then 用 Text-Column 間開一行行, 而用Marco record佢.
 板主 : 徵求中
 > VB Script - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - VB Script - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
VB Script
1 羅蘋 270 
2 foolface 170 
3 坤哥 80 
4 nono 80 
5 阿戊 70 
6 sorry 60 
7 Kevin 50 
8 紫曰 40 
9 玩家 40 
10 黑天黑地 40 
VB Script
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.078125