• استخراج رشته(های) فرعی از رشته با استفاده از FILTERXML

    استخراج رشته(های) فرعی از رشته با استفاده از FILTERXML

    FILTERXML اکسل از XPATH 1.0 استفاده می کند که متأسفانه به این معنی است که آنقدر که ما می خواهیم متنوع نیست.

    همچنین، به نظر می‌رسد اکسل اجازه بازگرداندن مقادیر گره‌های بازسازی‌شده را نمی‌دهد و منحصراً به شما امکان می‌دهد گره‌ها را به ترتیب ظاهر انتخاب کنید.

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

    تابع دو پارامتر دارد:

    =FILTERXML(<A string in valid XML format>,<A string in valid XPATH format>)
    
    FILTERXML = (<یک رشته در قالب XML معتبر>، <یک رشته در قالب XPATH معتبر>)


    فرض کنید سلول A1 دارای رشته است: ABC|123|DEF|456|XY-1A|ZY-2F|XY-3F|XY-4f|xyz|123. برای ایجاد یک رشته XML معتبر، از SUBSTITUTE استفاده می کنیم تا جداکننده را به ساختارهای تگ پایان و شروع معتبر تغییر دهیم. بنابراین برای به دست آوردن یک ساختار XML معتبر برای مثال داده شده، می توانیم انجام دهیم:
     

    "<t><s>"&SUBSTITUTE(A1,"|،"</s><s>")&"</s></t>"


    به دلایل خوانایی، من به ساختار بالا با کلمه <XML> به عنوان یک مکان نگهدار اشاره می کنم. در زیر توابع مختلف مفید XPATH را در یک ساختار معتبر برای فیلتر کردن گره ها خواهید یافت

    1) All Elements:
    =FILTERXML(<XML>,"//s")
    Returns: ABC, 123, DEF, 456, XY-1A, ZY-2F, XY-3F, XY-4f, xyz and 123 (all nodes)
    
    2) Elements by position:
    =FILTERXML(<XML>,"//s[position()=4]")
    Or:
    =FILTERXML(<XML>,"//s[4]")
    Returns: 456 (node on index 4)
    
    =FILTERXML(<XML>,"//s[position()<4]")
    Returns: ABC, 123 and DEF (nodes on index < 4)
    
    =FILTERXML(<XML>,"//s[position()=2 or position()>5]")
    Returns: 123, ZY-2F, XY-3F, XY-4f, xyz and 123 (nodes on index 2 or > 5)
    
    =FILTERXML(<XML>,"//s[last()]")
    Returns: 123 (node on last index)
    
    =FILTERXML(<XML>,"//s[position() mod 2 = 1]")
    Returns: ABC, DEF, XY-1A, XY-3F and xyz (odd nodes)
    
    =FILTERXML(<XML>,"//s[position() mod 2 = 0]")
    Returns: 123, 456, ZF-2F, XY-4f and 123 (even nodes)
    
    3) (Non) numeric elements:
    =FILTERXML(<XML>,"//s[number()=.]")
    Or:
    =FILTERXML(<XML>,"//s[.*0=0]")
    Returns: 123, 456, and 123 (numeric nodes)
    
    =FILTERXML(<XML>,"//s[not(number()=.)]")
    Or:
    =FILTERXML(<XML>,"//s[.*0!=0)]")
    Returns: ABC, DEF, XY-1A, ZY-2F, XY-3F, XY-4f and xyz (non-numeric nodes)
    
    4) Elements that (not) contain:
    =FILTERXML(<XML>,"//s[contains(., 'Y')]")
    Returns: XY-1A, ZY-2F, XY-3F and XY-4f (containing 'Y', notice XPATH is case sensitive, exclusing xyz)
    Returns: None (all nodes that are empty)

    اکنون واضح است که موارد بالا نمایشی از امکانات با توابع XPATH 1.0 است و شما می توانید طیف وسیعی از ترکیبات فوق و موارد دیگر را بدست آورید! من سعی کردم متداول ترین توابع رشته ای را پوشش دهم. اگر موردی را از دست دادید لطفا نظر خود را اعلام کنید.

    در حالی که این سؤال به خودی خود کاملاً گسترده است، من امیدوار بودم که راهنمایی کلی در مورد نحوه استفاده از FILTERXML برای سؤالات موجود ارائه دهم. فرمول آرایه‌ای از گره‌ها را برمی‌گرداند تا به هر طریق دیگری استفاده شود. خیلی از اوقات از آن در TEXTJOIN() یا INDEX() استفاده می کنم. اما من حدس می‌زنم گزینه‌های دیگر، توابع DA جدید برای ریختن نتایج باشند.

    توجه داشته باشید که هنگام تجزیه یک رشته از طریق FILTERXML()، کاراکتر علامت (&) و براکت زاویه سمت چپ (<) نباید به صورت تحت اللفظی ظاهر شوند. آنها به ترتیب باید با یا & یا < جایگزین شوند. گزینه دیگر این است که از کد عددی ISO/IEC 10646 به ترتیب & یا < استفاده کنید. پس از تجزیه، تابع این کاراکترها را به شکل تحت اللفظی به شما برمی گرداند. نیازی به گفتن نیست که جدا کردن یک رشته با نقطه ویرگول برای آن کار دشواری است.

    نظرات ارسال شده ارسال نظر جدید
    برای تبادل نظر، می بایست در سایت وارد شوید

    ورود به سایت
تماس سبد خرید بالا