خانه / هوش تجاری / پاور کوئری / تبدیل عدد به متن با پاورکوئری در اکسل

تبدیل عدد به متن با پاورکوئری در اکسل

تبدیل عدد به متن در اکسل همواره چالشی بوده، مخصوصا اگر بخواهیم این کار را برای اعداد فارسی انجام دهیم. در این پست نحوه تبدیل اعداد به متن در پاورکوئری آموزش داده شده است. قبل از معرفی کد منطق تبدیل را با هم بررسی کنیم.

 

منطق تبدیل عدد به متن

برای تبدیل اعداد به متن، آنها را میتوان به سه گروه ذیل تقسیم کرد.

یکان=> در این حالت هر عدد الگوی خاص خود را دارد و باید به عنوان مقادیر پایه تعریف کرد.

دهگان=> بخش دهگان شامل مقادیری مانند ده، بیست، سی و … می باشد اما در این بخش یک استثنی وجود دارد و بخش دهگان به دو قسمت تبدیل میشود، اگر دهگان عدد بزرگتر از ۲ باشد، مقدار آن به مقدار عدد یکان چسبیده میشود، مثلا در عدد ۲۳، مقدار بیست به عدد سه چسبیده میشود ولی اگر دهگان ۱ باشد مانند عدد ۱۳، در تبدیل آن به متن عدد یکان حذف میشود و جمعا مقدار سیزده در خروجی نوشته میشود.

صدگان => در صدگان اعداد به صورت پیش فرض و به شکل صد، دویست، سیصد و …. ثبت خواهند شد.

 

الگوی فوق برای اعداد بزرگتر به صورت دوره گردش ۳ تکرار میشود و فقط کلمه هزار یا میلیون به آنها اضافه می گردد. برای مثال عدد ۱۲۳۵۶۷ را میتوان به دو عدد ۱۲۳ و ۵۶۷ تقسیم کرد و فقط به قسمت اول آن مقدار هزار را اضافه نمود.

 

کد تبدیل عدد به متن در اکسل

با توجه به توضیحات مربوط میتوان تابع تبدیل عدد به متن در پاورکوئری را به صورت ذیل تعریف نمود:

 

(B) =>
let
   S1 = {
   {"یک","دو","سه","چهار","پنج","شش","هفت","هشت","نه","ده","یازده","دوازده","سیزده","چهارده","پانزده","شانزده","هفتده","هجده","نانزده"}, 
   {"بیست", "سی", "چهل", "پنجاه", "شصت", "هفتاد", "هشتاد", "نود"}, 
   {"صد", "دویست", "سیصد", "چهارصد", "پانصد", "شش صد", "هفت صد", "هشت صد", "نه صد"}
        }, 
   S2 = {"هزار", "میلیون", "میلیارد"}, 
   Z = List.Transform(List.Reverse(Text.ToList(Text.From(B))), Number.From), 
   Text1 = List.Transform(
      List.Positions(Z), 
      each (
         try
            if Number.Mod(_ + 1, 3) = 0 then
               S1{2}{Z{_} - 1}
            else if Number.Mod(_ + 1, 3) = 1 then
               (if List.Count(Z) > _ + 1 then
               (if Z{_ + 1} = 1 then S1{0}{Z{_} + 10 - 1} else S1{0}{Z{_} - 1})
            else
               S1{0}{Z{_} - 1})
            else
               (if Z{_} = 1 then "" else S1{1}{Z{_} - 2}) otherwise "")), 
   Text2 = List.Combine( List.Transform({{""}, {" هزار"}, {" میلیون"}, {" میلیارد"}}, each List.Repeat(_, 3))), 
   Text3 = List.Transform(List.Positions(Text1), each if Text1{_} = "" then "" else Text2{_}), 
   Text = List.Transform(List.Positions(Text3), each if List.Count(List.Select(List.FirstN(Text3, _ + 1), (x) => x = Text3{_})) > 1 then Text1{_} elseText1{_} & Text3{_}), 
   Combine = Text.Clean(Text.Combine(List.Reverse(List.Select(Text, each _ <> "")), " و "))
in
C   ombine

در این تابع عدد B به عنوان ورودی تعریف میشود. در ادامه مقادیر S1 و S2  به صورت لیست تعریف شده و شامل تمامی حالات پایه می باشد.

سپس در مرحله Z، رقمهای عدد مربوطه جدا شده و در ادامه ربورس می گردد.
در گام بعدی مقدار متن مربوط به هر یک از رقم ها شناسایی میشود و در نهایت واژه های میلیون و هزار برای اعداد تعیین شده ثبت می گردد.
لازم به ذکر است که این کد فقط تا میلیارد را میتواند تبدیل کند و برای اعداد بزرگتر نیزا به توسعه دارد.

 

درباره‌ی امید معتمدی

محقق، مدرس، نویسنده و مشاور در حوزه تحلیل داده

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.