در کلان خود، ایان باید یک رشته کوتاه را در یک رشته بسیار بزرگ قرار دهد. رشته بزرگ اساسا متن یک فایل کامل است، گاهی اوقات بیش از 180000 کاراکتر. نه Search() و نه Find() کار نمی کند، مگر اینکه رشته بزرگ را به قسمت های کوچکتر تقسیم کند (مثلاً کمتر از 32000 کاراکتر)، و هر قسمت را به ترتیب جستجو کند. مشکل این کالبد شکافی این است که ایان نمی داند متن مورد نظرش در کجای فایل قرار دارد یا حتی نمی داند که آیا در آن وجود دارد یا نه، و کاملاً ممکن است که متن مورد نظر خود را خرد کند و هرگز نتواند آن را پیدا کند.
سه روش کلی وجود دارد که می توانید نمونه یک رشته را در رشته دیگر در VBA جستجو کنید:
- روش را پیدا کنید
- روش جستجو
- تابع InStr
دو رویکرد اول همانهایی هستند که ایان به طور خاص به آنها اشاره می کند، بنابراین او می داند که چگونه از آنها استفاده کند. آنها در واقع متدهایی هستند که با شی WorksheetFunction استفاده می شوند. آنها اساسا برای دسترسی به توابع کاربرگ FIND و SEARCH از داخل VBA استفاده می شوند.
آنها برای یافتن اطلاعات در یک رشته بزرگ و بزرگ بهترین نیستند. برای این کار باید از تابع InStr، یک تابع بومی VBA استفاده کنید. این امر به ویژه در صورتی صادق است که رشته بزرگ و بزرگ شما از یک فایل متنی بیرون کشیده شود و در واقع در یک ورک بوک قرار نگیرد.
بیایید بگوییم که شما یک فایل متنی بزرگ دارید که می خواهید مقدار متنی خاصی را جستجو کنید. شما می توانید کل فایل را در یک زمان به این ترتیب در حافظه بخوانید:
Sub CheckFullFile()
Dim sFullFile As String
Dim sFindText As String
Dim lFileSize As Long
Dim lStart As Long
Dim lLoc As Long
Dim sMsg As String
This is what you want to search for
sFindText = "mytext"
Open "c:ReallyBigFile.txt" For Input As 1
lFileSize = Lof(1)
sFullFile = Input(lFileSize, 1)
Close 1
sFullFile = LCase(sFullFile)
lStart = 0
lLoc = InStr(sFullFile, sFindText)
While lLoc > 0
sMsg = sMsg & "Found at " & lLoc & vbCrLf
lStart = lLoc + 1
lLoc = InStr(lStart, sFullFile, sFindText)
Wend
MsgBox sMsg
End Sub
ماکرو فایل متنی مشخص شده را باز می کند، کل محتوای فایل را در رشته sFullFile قرار می دهد و تمام نمونه های متغیر sFindText را در آن متن نمایش می دهد. توجه داشته باشید که محتویات فایل به حروف کوچک تبدیل می شوند. این امر ضروری است زیرا تابع InStr به حروف کوچک و بزرگ حساس است. اگر می خواهید جستجوی شما به حروف بزرگ و کوچک حساس باشد، نیازی به انجام تبدیل ندارید.
تنها محدودیت موثر در کدهای این چنینی، میزان حافظه ای است که در سیستم خود دارید. VBA محدودیت طول رشته موثری در حدود 2 میلیارد کاراکتر دارد، اما تعداد کمی از سیستم ها دارای این مقدار RAM هستند. البته، اکثر فایل های متنی که می خوانید به آن اندازه فایل نیز نزدیک نمی شوند. آزمایش با فایل های داده واقعی به شما اطلاع می دهد که آیا این رویکرد خواندن فایل کامل برای شما کار می کند یا خیر.
اگر یک فایل متنی دارید که مانند بسیاری از خطوط متنی در آن وجود دارد، روش کارآمدتری برای پردازش فایل و جستجوی متن شما وجود دارد. (خطوط منفرد خطوطی هستند که با بازگشت کالسکه و/یا تغذیه خط خاتمه می یابند.)
Sub CheckEachLine()
Dim sRaw As String
Dim sFindText As String
Dim lFileSize As Long
Dim lStart As Long
Dim lLoc As Long
Dim sMsg As String
This is what you want to search for
sFindText = "mytext"
Open "c:ReallyBigFile.txt" For Input As 1
Do Until Eof(1)
Line Input #1, sRaw
sRaw = LCase(sRaw)
lStart = 0
lLoc = InStr(sTemp, sFindText)
While lLoc > 0
sMsg = sMsg & "Found at " & lLoc & vbCrLf
lStart = lLoc + 1
lLoc = InStr(lStart, sRaw, sFindText)
Wend
Loop
Close 1
MsgBox sMsg
End Sub
با این رویکرد، شما واقعاً نباید نگران طول فایل متنی باشید، زیرا تنها یک خط در هر زمان در حافظه خوانده شده و پردازش می شود.
مطمئنم که این ایده را دریافت کرده اید—InStr راهی است که می خواهید با یافتن اطلاعات در رشته های منبع شگفت انگیز بزرگ کار کنید.