返回列表 上一主題 發帖

文字檔讀取問題

回復 10# herhsiu
文字檔只有2列嗎?
第一列 有規律性嗎? 如最後一定有,'N'嗎?  要寫在哪一個檔?
  00:01:46  資料 = RAW values ( 'Z9.01','FG','90','SZ001.1','GL01',SYSDATE,'N','0.1','0.1' , '-
第二列 : data需依此數目往左shift    你的示意圖不夠清楚 請加註文字說明
如 "00:01:47        -0.001        0        -0.038        0.035        0.042        -0.02        -0.13        -0.256        -0.009        0.004        -0.76        -0.134        968      如何放置於示意檔?  一定是3個欄位嗎 ?

TOP

回復 11# GBKEE


    回復 11# GBKEE

文字檔只有2列嗎?
第一列 有規律性嗎? 如最後一定有,'N'嗎?  要寫在哪一個檔?  
00:01:46  資料 = RAW values ( 'Z9.01','FG','90','SZ001.1','GL01',SYSDATE,'N','0.1','0.1' , '-

第二列 : data需依此數目往左shift    你的示意圖不夠清楚 請加註文字說明
如 "00:01:47        -0.001        0        -0.038        0.035        0.042        -0.02        -0.13        -0.256        -0.009        0.004        -0.76        -0.134        968      如何放置於示意檔?  一定是3個欄位嗎 ?

GBKEE大大:
因為問題太多了,一開始不太好意思問太多所以把問題分開來詢問,沒有一次把問題給說清楚還請見諒,我想做的東西是希望輸入查詢條件後自動到程式指定路徑查詢資料,然後把data import至excel並且分欄以便資料分析,其中一列data很規律直接import然後做分欄就可以(第一列),另外一列部分data需要分欄後做再欄位shift(第二列)處理
1.: 檔案內的資料不只兩列,裡頭有很多資料,我要的data是格式跟這兩列相同的部分. 檔案格式具有規律性,第一列的資料一定有 SYSDATE,'N',
2.:示意圖的第一欄數字即是第二列data裡面 [parentNo]欄位後面的數字( 此例為0不需要往左shift) ,Raw data欄位不只3個欄位,總共有十幾個欄位.

不知道這樣解釋夠清楚嗎?

PS:我附上的兩列例子在文字檔裡都是一整列的data,在網頁上會自動分列.

TOP

本帖最後由 GBKEE 於 2011-9-27 14:50 編輯

回復 12# herhsiu
  1. Option Explicit
  2. Sub 第一列()
  3.     Dim Str, A
  4.     Str = "00:01:46  資料 = RAW values ( 'Z9.01','FG','90','SZ001.1','GL01',SYSDATE,'N','0.1','0.1' , '-0.0129','0.006','-0.0119','0.0305','-0.0047','-0.0066','-0.0158','0.0007', '-0.0233','-0.0057','-0.0124','0.0057','-0.0113','0.0174','0.0005','-0.0122', '-0.0136','-0.0074','-0.016','0.0003','0.0025','-0.0143','0.0031','0.0121', '0.0161','-0.0222','0.0013','-0.0118','0.0004','-0.0116','-0.0055','0.0155', '-0.0076','0.0391','0.0001','0.0117','-0.012','0.0159','-0.0137','0.0085')"
  5.     A = InStr(Str, "SYSDATE,'N")        ' 傳回數字 -> SYSDATE,'N 在 Str字串的位置
  6.     A = Mid(Str, A + 10)                '截起Str字串 A+10 起.    '(SYSDATE,'N) 字串長度 => 10
  7.     Str = Mid(Str, 1, 8) & A            '結合 兩字串  'Mid(Str, 1, 8)->00:01:46
  8.     Str = Replace(Str, "'", "")         '消除字元 -> '
  9.     Str = Mid(Str, 1, Len(Str) - 1)     '刪除最後字元 -> )
  10.     MsgBox Str
  11.     Str = Split(Str, ",")      '->      '將字串 轉為陣列
  12.     [A1].Resize(, UBound(Str)) = Str    '陣列 放置於列
  13.     [A3].Resize(UBound(Str)) = Application.WorksheetFunction.Transpose(Str)        '陣列 放置於欄
  14. End Sub
  15. Sub 第二列()
  16.     Dim Str As Variant, Ar(), A As Variant, i As Integer, ii As Integer, C As Integer, R As Integer
  17.     Str = "00:01:47 EQS send GLData_V5 to DS. [RvMsg]: [primPrcdId]Z9.01 [lotId]SZ001.1 [GLAutoRecipeId]V90_20 [GLEqpId]GL01 [stage]FG [parentNo]0 [intraTranslationX]-0.001 [intraTranslationY]0.000 [intraMagnification]-0.038 [intraRotation]0.035 [interRotation]0.042 [interOrthogonality]-0.020 [interExpansionX]-0.130 [interExpansionY]-0.256 [interTranslationX]-0.009 [interTranslationY]0.004 [asymrotation]-0.760 [asymmagnification]-0.134 [FlagSet]-00068+00036+00000+01000"
  18.     ReDim Ar(0)                                 '重新宣告陣列維度
  19.     Ar(0) = Mid(Str, 1, 8)                      '將值指定給陣列
  20.     A = InStr(Str, "[parentNo]")                '傳回數字 -> [parentNo] 在 Str字串的位置
  21.     Str = Mid(Str, A + Len("[parentNo]"))       '截起Str字串 A 起.
  22.     Do
  23.         ReDim Preserve Ar(UBound(Ar) + 1)       '重新宣告陣列維數 ( 加1維數 )  'Preserve->保留原有資料
  24.         Ar(UBound(Ar)) = Val(Str)               '將值指定給 ->陣列的最大維數
  25.                                                 'Val ->(Str) 字串轉換為數字
  26.         A = InStr(Str, "]")                     '傳回數字 -> " ] " 在 Str字串的位置
  27.         Str = Mid(Str, A + 1) '
  28.     Loop While InStr(Str, "]")                  '字串裡有"]" 執行回圈
  29.     A = 0
  30.     For i = 1 To Len(Str) Step 6                'Step 6 ->每隔6字元
  31.        A = A + Val(Mid(Str, i, 6))
  32.     Next
  33.     ReDim Preserve Ar(UBound(Ar) + 1)
  34.     Ar(UBound(Ar)) = A                          '最後的數字指定給 ->陣列的最大維數
  35.     With Sheet2
  36.         C = .[A1].End(xlToRight).Column - 1     '取得欄數
  37.         R = 2                                   'A2 開始
  38.         i = 0                                   '陣列的第一維
  39.         Do While .Cells(R, "A") <> "" And i <= UBound(Ar) '  i <= UBound(Ar) -> 陣列的維數內
  40.             ii = 1                                  '欄數歸回第一欄
  41.             Do While ii <= C And i <= UBound(Ar)
  42.                 .Cells(R, "A").Offset(, .Cells(R, "A") + ii) = Ar(i)
  43.                 'Offset(, .Cells(R, "A") + ii)      '.Cells(R, "A")-> 取得Shift 數字 ,ii(欄數)
  44.                 i = i + 1
  45.                 ii = ii + 1                      '下一陣列維數
  46.             Loop
  47.             R = R + 1                             '下一列
  48.         Loop
  49.     End With
  50. End Sub
複製代碼

TOP

回復 13# GBKEE

GBKEE大大,
我的data並不會每一列都相同,你給的程式碼replace可以完成分欄工作,但是相同指令需要執行很多次一定很沒有效率,有更好的方式嗎?謝謝~
                     Str = Replace(Str, "intraTranslationX", "")         
                    Str = Replace(Str, "intraTranslationY", "")         
                    Str = Replace(Str, "intraMagnification", "")         
                    Str = Replace(Str, "intraRotation", "")         
                    Str = Replace(Str, "interRotation", "")         
                    Str = Replace(Str, "interOrthogonality", "")         
                    Str = Replace(Str, "interExpansionX", "")         
                    Str = Replace(Str, "interExpansionY", "")         
                    Str = Replace(Str, "interTranslationX", "")         
                    Str = Replace(Str, "interTranslationY", "")         
                    Str = Replace(Str, "asymrotation", "")                     
                    Str = Replace(Str, "asymmagnification", "")               
                    Str = Replace(Str, "lotId", "")     
                    Str = Replace(Str, "ovlAutoRecipeId", "")  
                     Str = Replace(Str, "ovlEqpId", "")   
                    Str = Replace(Str, "stage", "")         
                    Str = Replace(Str, "parentLotIdNo", "")         
                    Str = Replace(Str, "EQS send OVLMetrologyData_V5 to FFBS. RvMsg: primPrcdId", "")         
                    Str = Replace(Str, "FlagSet", "")

TOP

回復 14# herhsiu
我的data並不會每一列都相同
那就不適用程式,巨集.

TOP

回復 15# GBKEE


    沒關係~還是很感謝GBKEE的幫忙,讓我節省了許多data整理:D 的時間.

TOP

我要將parentLotId_xxxxxxxx.1取代為0,請教一下為何下列指令不work?

Str = Replace(Str, "parentLotId_?.?", "")

TOP

回復 17# herhsiu
Replace 函數  無法用  ?  *  搜尋要替換的字串, 可否po 這列字串 試試看

TOP

回復 18# GBKEE

如果能把parentLotId_xxxxxxx.x 這些欄位都刪除,那我的問題就全都解決了,只差這一步而已,麻煩大大幫我看看怎麼寫比較好,謝謝~

    00:10:56 TR4A-9.01 A80168.5 V81_79 OL1 AH_H 1 parentLotId_1A80168.1 0.000 0.000 0.299 -0.058 0.052 -0.035 -0.155 0.004 0.001 0.000 -0.037 0.071 +00035-00006+00000+00700

TOP

回復 19# herhsiu
  1. Sub 第一列()
  2.     Dim Str, A, i, Ar
  3.     Str = "00:10:56 TR4A-9.01 A80168.5 V81_79 OL1 AH_H 1 parentLotId_1A80168.1 0.000 0.000 0.299 -0.058 0.052 -0.035 -0.155 0.004 0.001 0.000 -0.037 0.071 +00035-00006+00000+00700"
  4.     ReDim Ar(0)                                                 '重新宣告陣列維度
  5.     Ar(0) = Mid(Str, 1, 8)                                      '將值指定給陣列
  6.     A = InStr(Str, "parentLotId_") + Len("parentLotId_")       ' 傳回數字 -> SYSDATE,'N 在 Str字串的位置   
  7.     For i = A To Len(Str)
  8.         If Mid(Str, i, 1) = "." Then Exit For
  9.     Next
  10.     Str = Split(Mid(Str, i + 3), " ")
  11.     For i = 0 To UBound(Str)
  12.         ReDim Preserve Ar(UBound(Ar) + 1)
  13.         Ar(UBound(Ar)) = Str(i)                                 '最後的數字指定給 ->陣列的最大維數
  14.     Next
  15.      A = 0
  16.      For i = 1 To Len(Ar(UBound(Ar))) Step 6                'Step 6 ->每隔6字元
  17.        A = A + Val(Mid(Ar(UBound(Ar)), i, 6))
  18.     Next
  19.     Ar(UBound(Ar)) = A
  20.     [A1].Resize(, UBound(Ar) + 1) = Ar '陣列 放置於列
  21.     [A3].Resize(UBound(Ar) + 1) = Application.WorksheetFunction.Transpose(Ar)     '陣列 放置於欄
  22. End Sub
複製代碼

TOP

        靜思自在 : 做該做的事是智慧,做不該做的事是愚癡。
返回列表 上一主題