Board logo

標題: 文字檔讀取問題 [打印本頁]

作者: herhsiu    時間: 2011-9-22 16:55     標題: 文字檔讀取問題

請教大大,針對文字檔做資料讀取,想要將包含特定字串內容的某一列資料讀取匯入excel該如何做?謝謝~
作者: GBKEE    時間: 2011-9-23 08:41

回復 1# herhsiu
已有許多發文 ,你可爬文暸解一下,如真不解,也需將題目說清楚.  包含特定字串內容的某一列資料讀取匯入excel 如此太含糊,要舉例才明白
作者: herhsiu    時間: 2011-9-23 13:15

對不起說的不夠清楚,因為需要在多個文字檔內查詢資料,希望能夠透過vba在文字檔案搜尋某一字串,再將包含此字串的整列data mport至excel工作表,請大大指點一二,謝謝~
作者: GBKEE    時間: 2011-9-23 16:36

回復 3# herhsiu
  1. Sub 匯入文字檔()
  2.     Dim i As Integer, ii As Integer, Mystr As String
  3.     With Application.FileDialog(msoFileDialogFilePicker)  '[檔案選擇器]
  4.         .AllowMultiSelect = True                '可多重選擇檔案
  5.         .Title = "文字檔 匯入excel"             '[檔案選擇器] 的標題
  6.         .Filters.Clear                          '清除 [檔案選擇器] 對話方塊的檔案篩選
  7.         .Filters.Add "文字檔", "*.txt", 1       '新增 [檔案選擇器] 對話方塊的檔案篩選
  8.                                                 '篩選清單中新控制項所在位置的數值  1
  9.         .Filters.Add "*.*", "*.*", 2            '新增 [檔案選擇器] 對話方塊的檔案篩選
  10.                                                 '篩選清單中新控制項所在位置的數值 2
  11.         .FilterIndex = 1                        '當檔案對話方塊首次開啟時,預設篩選判定所顯示的檔案類型。
  12.         If .Show = 0 Then Exit Sub              '沒選擇檔案時離開檔案
  13.             For i = 1 To .SelectedItems.Count   '依序在選擇檔案數目的迴圈
  14.                 Open .SelectedItems(i) For Input As #1   '開啟文字檔
  15.                 Do While Not EOF(1)                      '不是檔案底部時 執行迴圈
  16.                     Input #1, Mystr                      '從已開啟的循序讀取資料,並將資料指定給變數。->mystr
  17.                     If Mystr Like "*test*" Then          '請修改"test" 為->要你搜尋某一字串
  18.                         Cells(ii + 1, "a") = Mystr       '整列匯入工作表
  19.                         ii = ii + 1                      '下一列
  20.                     End If
  21.                 Loop
  22.                 Close #1                                 '關閉文字檔
  23.            Next
  24.     End With
  25. End Sub
複製代碼

作者: herhsiu    時間: 2011-9-26 17:08

感謝大大詳盡的答覆......
作者: herhsiu    時間: 2011-9-26 17:47

不好意思,在試的時候發現一個問題:
如果該列有包含逗號該列就會被截斷,該怎麼處理這個狀況呢?謝謝~
作者: GBKEE    時間: 2011-9-26 20:50

回復 6# herhsiu
  1. Sub 匯入文字檔A()
  2.     Dim i As Integer, ii As Integer, Str As Variant, F As Object
  3.     With Application.FileDialog(msoFileDialogFilePicker)  '[檔案選擇器]
  4.         .AllowMultiSelect = True                '可多重選擇檔案
  5.         .Title = "文字檔 匯入excel"             '[檔案選擇器] 的標題
  6.         .Filters.Clear                          '清除 [檔案選擇器] 對話方塊的檔案篩選
  7.         .Filters.Add "文字檔", "*.txt", 1       '新增 [檔案選擇器] 對話方塊的檔案篩選
  8.                                                 '篩選清單中新控制項所在位置的數值  1
  9.         .Filters.Add "*.*", "*.*", 2            '新增 [檔案選擇器] 對話方塊的檔案篩選
  10.                                                 '篩選清單中新控制項所在位置的數值 2
  11.         .FilterIndex = 1                        '當檔案對話方塊首次開啟時,預設篩選判定所顯示的檔案類型。
  12.         If .Show = 0 Then Exit Sub              '沒選擇檔案時離開檔案
  13.         For i = 1 To .SelectedItems.Count   '依序在選擇檔案數目的迴圈
  14.             Set F = CreateObject("Scripting.FileSystemObject").OpenTextFile(.SelectedItems(i), 1, -1)
  15.             'F.READALL 讀取檔案的文字, Split(字串, 分隔字串)->傳回一維陣列
  16.             For Each Str In Split(F.READALL, Chr(10))  '傳回一維陣列 的迴圈
  17.                 If Str Like "*TEST*" Then
  18.                     Cells(ii + 1, "a") = Str            '整列匯入工作表
  19.                     ii = ii + 1                         '下一列
  20.                 End If
  21.             Next
  22.             F.Close                                     '關閉文字檔
  23.         Next
  24.     End With
  25. End Sub
複製代碼

作者: herhsiu    時間: 2011-9-27 07:23

回復 7# GBKEE

多謝大大的幫忙,但是我又碰到另一個問題是有些data 匯入後欄位需要向左shift一欄或兩欄(根據A欄值決定需不需要shift),這又該如何做?謝謝~

    [attach]7954[/attach]
[attach]7955[/attach]
作者: GBKEE    時間: 2011-9-27 09:46

回復 8# herhsiu
你的附檔中沒有程式碼如何幫你修正.
文字檔也要附上看看 程序是要依需求來寫的.
作者: herhsiu    時間: 2011-9-27 10:54

ㄜ....大大不好意思,因為檔案是在公司礙於PIP限制無法上傳,我在家中上傳的檔案是示意圖,我想做的事情是:查詢到檔案裡面內容如果符合下面兩列格式的data 需要匯入(部分內容為固定已可由GBKEE大大所提供程式達成),現在碰到的問題是第二列格式,其中有一欄位[parentNo]後面的數字為shift的欄位數,該列data需依此數目往左shift,另外如果我希望這些欄位能夠資料剖析成最後兩列的格式該如何做?因為TextToColumns只有一個自訂的符號,要做到好像有困難.不好意思問題有點多


"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')

"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
/////////////////////////////////////////////

想要將檔案import轉換成下列格式"00:01:46        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                                                                                               
"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
作者: GBKEE    時間: 2011-9-27 11:57

回復 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個欄位嗎 ?
作者: herhsiu    時間: 2011-9-27 12:27

回復 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,在網頁上會自動分列.
作者: GBKEE    時間: 2011-9-27 14:46

本帖最後由 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
複製代碼

作者: herhsiu    時間: 2011-9-27 18:21

回復 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", "")
作者: GBKEE    時間: 2011-9-27 19:51

回復 14# herhsiu
我的data並不會每一列都相同
那就不適用程式,巨集.
作者: herhsiu    時間: 2011-9-28 15:49

回復 15# GBKEE


    沒關係~還是很感謝GBKEE的幫忙,讓我節省了許多data整理:D 的時間.
作者: herhsiu    時間: 2011-9-29 13:25

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

Str = Replace(Str, "parentLotId_?.?", "")
作者: GBKEE    時間: 2011-9-29 15:11

回復 17# herhsiu
Replace 函數  無法用  ?  *  搜尋要替換的字串, 可否po 這列字串 試試看
作者: herhsiu    時間: 2011-9-29 15:44

回復 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
作者: GBKEE    時間: 2011-9-29 16:42

回復 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
複製代碼

作者: herhsiu    時間: 2011-9-29 18:28

回復 20# GBKEE


    好像有點複雜我要研究一下子.........謝謝GBKEE大大~
作者: herhsiu    時間: 2011-9-30 09:38

回復 20# GBKEE


     A = 0
    For i = 1 To Len(Ar(UBound(Ar))) Step 6                'Step 6 ->每隔6字元
       A = A + Val(Mid(Ar(UBound(Ar)), i, 6))
    Next
    Ar(UBound(Ar)) = A


請問大大這一段的作用為何?看不懂~
作者: GBKEE    時間: 2011-9-30 10:13

回復 22# herhsiu
UBound函數: 表示指定陣列某維最大可使用的陣列索引
Ar(UBound(Ar)) =>    "+00035-00006+00000+00700"
For i = 1 To Len(Ar(UBound(Ar))) Step 6                'Step 6 ->每隔6字元
          A = A +  Val(Mid(Ar(UBound(Ar)), i, 6))
         '->  i=1->   +00035
          '-> i=1+6    -00006
          '-> i=7+6  +00000
          '-> i=13     +00700
    Next
作者: herhsiu    時間: 2011-10-1 18:04

原來如此,受教了~
感謝大大,問題完全解決了,謝謝~




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)