ایجاد سوال
dark_mode
0 دوستدار 0 امتیاز منفی
11 visibility
موضوع: آفیس توسط:

در کلان خود، ایان باید یک رشته کوتاه را در یک رشته بسیار بزرگ قرار دهد. رشته بزرگ اساسا متن یک فایل کامل است، گاهی اوقات بیش از 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 راهی است که می خواهید با یافتن اطلاعات در رشته های منبع شگفت انگیز بزرگ کار کنید.

اگر خواستی، با این لینک از ما حمایت کن

پاسخ شما

looks_5نام شما برای نمایش - اختیاری
حریم شخصی : آدرس ایمیل شما محفوظ میماند و برای استفاده های تجاری و تبلیغاتی به کار نمی رود
عدد چهار رقمی در تصویر را وارد کنید

برای جلوگیری از این تایید در آینده, لطفا وارد شده یا ثبت نام کنید.
اگر حساب گوگل دارید به راحتی وارید شوید

0 پاسخ وجود دارد

سوال مشابهی یافت نشد

برای دسترسی راحت به مطالب سایت ، اپلیکیشن سایت را نصب کنید
و لطفا بعد از نصب امتیاز دهید. با تشکر از حمایت شما

23.2k سوال

8.5k پاسخ

608 دیدگاه

9.7k کاربر

143 نفر آنلاین
0 عضو و 143 مهمان در سایت حاضرند
بازدید امروز: 4104
بازدید دیروز: 25459
بازدید کل: 15231621
...