標題:
文字檔讀取問題
[打印本頁]
作者:
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
Sub 匯入文字檔()
Dim i As Integer, ii As Integer, Mystr As String
With Application.FileDialog(msoFileDialogFilePicker) '[檔案選擇器]
.AllowMultiSelect = True '可多重選擇檔案
.Title = "文字檔 匯入excel" '[檔案選擇器] 的標題
.Filters.Clear '清除 [檔案選擇器] 對話方塊的檔案篩選
.Filters.Add "文字檔", "*.txt", 1 '新增 [檔案選擇器] 對話方塊的檔案篩選
'篩選清單中新控制項所在位置的數值 1
.Filters.Add "*.*", "*.*", 2 '新增 [檔案選擇器] 對話方塊的檔案篩選
'篩選清單中新控制項所在位置的數值 2
.FilterIndex = 1 '當檔案對話方塊首次開啟時,預設篩選判定所顯示的檔案類型。
If .Show = 0 Then Exit Sub '沒選擇檔案時離開檔案
For i = 1 To .SelectedItems.Count '依序在選擇檔案數目的迴圈
Open .SelectedItems(i) For Input As #1 '開啟文字檔
Do While Not EOF(1) '不是檔案底部時 執行迴圈
Input #1, Mystr '從已開啟的循序讀取資料,並將資料指定給變數。->mystr
If Mystr Like "*test*" Then '請修改"test" 為->要你搜尋某一字串
Cells(ii + 1, "a") = Mystr '整列匯入工作表
ii = ii + 1 '下一列
End If
Loop
Close #1 '關閉文字檔
Next
End With
End Sub
複製代碼
作者:
herhsiu
時間:
2011-9-26 17:08
感謝大大詳盡的答覆......
作者:
herhsiu
時間:
2011-9-26 17:47
不好意思,在試的時候發現一個問題:
如果該列有包含逗號該列就會被截斷,該怎麼處理這個狀況呢?謝謝~
作者:
GBKEE
時間:
2011-9-26 20:50
回復
6#
herhsiu
Sub 匯入文字檔A()
Dim i As Integer, ii As Integer, Str As Variant, F As Object
With Application.FileDialog(msoFileDialogFilePicker) '[檔案選擇器]
.AllowMultiSelect = True '可多重選擇檔案
.Title = "文字檔 匯入excel" '[檔案選擇器] 的標題
.Filters.Clear '清除 [檔案選擇器] 對話方塊的檔案篩選
.Filters.Add "文字檔", "*.txt", 1 '新增 [檔案選擇器] 對話方塊的檔案篩選
'篩選清單中新控制項所在位置的數值 1
.Filters.Add "*.*", "*.*", 2 '新增 [檔案選擇器] 對話方塊的檔案篩選
'篩選清單中新控制項所在位置的數值 2
.FilterIndex = 1 '當檔案對話方塊首次開啟時,預設篩選判定所顯示的檔案類型。
If .Show = 0 Then Exit Sub '沒選擇檔案時離開檔案
For i = 1 To .SelectedItems.Count '依序在選擇檔案數目的迴圈
Set F = CreateObject("Scripting.FileSystemObject").OpenTextFile(.SelectedItems(i), 1, -1)
'F.READALL 讀取檔案的文字, Split(字串, 分隔字串)->傳回一維陣列
For Each Str In Split(F.READALL, Chr(10)) '傳回一維陣列 的迴圈
If Str Like "*TEST*" Then
Cells(ii + 1, "a") = Str '整列匯入工作表
ii = ii + 1 '下一列
End If
Next
F.Close '關閉文字檔
Next
End With
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
Option Explicit
Sub 第一列()
Dim Str, A
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')"
A = InStr(Str, "SYSDATE,'N") ' 傳回數字 -> SYSDATE,'N 在 Str字串的位置
A = Mid(Str, A + 10) '截起Str字串 A+10 起. '(SYSDATE,'N) 字串長度 => 10
Str = Mid(Str, 1, 8) & A '結合 兩字串 'Mid(Str, 1, 8)->00:01:46
Str = Replace(Str, "'", "") '消除字元 -> '
Str = Mid(Str, 1, Len(Str) - 1) '刪除最後字元 -> )
MsgBox Str
Str = Split(Str, ",") '-> '將字串 轉為陣列
[A1].Resize(, UBound(Str)) = Str '陣列 放置於列
[A3].Resize(UBound(Str)) = Application.WorksheetFunction.Transpose(Str) '陣列 放置於欄
End Sub
Sub 第二列()
Dim Str As Variant, Ar(), A As Variant, i As Integer, ii As Integer, C As Integer, R As Integer
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"
ReDim Ar(0) '重新宣告陣列維度
Ar(0) = Mid(Str, 1, 8) '將值指定給陣列
A = InStr(Str, "[parentNo]") '傳回數字 -> [parentNo] 在 Str字串的位置
Str = Mid(Str, A + Len("[parentNo]")) '截起Str字串 A 起.
Do
ReDim Preserve Ar(UBound(Ar) + 1) '重新宣告陣列維數 ( 加1維數 ) 'Preserve->保留原有資料
Ar(UBound(Ar)) = Val(Str) '將值指定給 ->陣列的最大維數
'Val ->(Str) 字串轉換為數字
A = InStr(Str, "]") '傳回數字 -> " ] " 在 Str字串的位置
Str = Mid(Str, A + 1) '
Loop While InStr(Str, "]") '字串裡有"]" 執行回圈
A = 0
For i = 1 To Len(Str) Step 6 'Step 6 ->每隔6字元
A = A + Val(Mid(Str, i, 6))
Next
ReDim Preserve Ar(UBound(Ar) + 1)
Ar(UBound(Ar)) = A '最後的數字指定給 ->陣列的最大維數
With Sheet2
C = .[A1].End(xlToRight).Column - 1 '取得欄數
R = 2 'A2 開始
i = 0 '陣列的第一維
Do While .Cells(R, "A") <> "" And i <= UBound(Ar) ' i <= UBound(Ar) -> 陣列的維數內
ii = 1 '欄數歸回第一欄
Do While ii <= C And i <= UBound(Ar)
.Cells(R, "A").Offset(, .Cells(R, "A") + ii) = Ar(i)
'Offset(, .Cells(R, "A") + ii) '.Cells(R, "A")-> 取得Shift 數字 ,ii(欄數)
i = i + 1
ii = ii + 1 '下一陣列維數
Loop
R = R + 1 '下一列
Loop
End With
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
Sub 第一列()
Dim Str, A, i, Ar
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"
ReDim Ar(0) '重新宣告陣列維度
Ar(0) = Mid(Str, 1, 8) '將值指定給陣列
A = InStr(Str, "parentLotId_") + Len("parentLotId_") ' 傳回數字 -> SYSDATE,'N 在 Str字串的位置
For i = A To Len(Str)
If Mid(Str, i, 1) = "." Then Exit For
Next
Str = Split(Mid(Str, i + 3), " ")
For i = 0 To UBound(Str)
ReDim Preserve Ar(UBound(Ar) + 1)
Ar(UBound(Ar)) = Str(i) '最後的數字指定給 ->陣列的最大維數
Next
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
[A1].Resize(, UBound(Ar) + 1) = Ar '陣列 放置於列
[A3].Resize(UBound(Ar) + 1) = Application.WorksheetFunction.Transpose(Ar) '陣列 放置於欄
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/)