ক্যারেক্টার বা স্ট্রিং যে যাই বলি না কেন। আসলে আর প্রোগ্রামিং এ স্ট্রিং নামে কোন ডাটা টাইপ নাই। অনেকেই ক্যারেক্টার টাইপকে স্ট্রিং বলে কারন তারা ৮-১০ টা প্রোগ্রামিং ভাষা পারে সেই জন্য। যাইহোক এইবার আসি মূল ঘটনায়। আমরা তো সব সময় সিঙ্গেল কোটে ক্যারেক্টার লিখে আসছি। ডাবল কোটেও লিখা যায় । দেখে নেই।

> a <- 'Abul Mal'

> a

[1] "Abul Mal"

> b <- "Vat"

> b

[1] "Vat"

তো প্রমানও পেয়ে গেলাম। মাঝে মাঝে কিছু অসুবিধার মুখোমুখিও হয়ে যাই। যেমন আপনি হয়তো ডাবল কোট দিয়ে শুরু করেছেন কিন্তু শেষ করেছেন সিঙ্গেল কোট দিয়ে কিংবা কোথায় কোন শব্দ মার্ক করে দেওয়ার জন্য সিঙ্গেল বা ডাবল কোট এর প্রয়োজন পরতে পারে। কিভাবে কি করলে কাজ সুবিধা হবে তা দেখি ফেলি ঝটপট।

> a <- 'kinley free"

+ "kinley free'

> a

[1] "kinley free\"\n\"kinley free"

আপনি প্রথমে ভুল করেছেন কিন্তু আর প্রোগ্রামিং কোন এরর থ্রো না করে + নামক আজব এক জিনিস ধরাইয়া দিলো। তারপরে দেখলেন যে প্লাসের ভিতরে লিখা যায়। এইটা কি টাইপের রাজনীতি! আসলে আপনি প্রথম লাইনে সিঙ্গেল কোট দিয়ে লিখেছেন এবং শেষ করেছেন ডাবল কোট দিয়ে। আর প্রোগ্রামিং ধরে নিছে যে আপনার স্ক্রিপটি বা লাইনটি এখনো শেষ হয় নাই। তাই সে অতিথি আপ্পায়ন করার জন্য + নামক খাবার সামনে হাজির করেছে। এবার দেখুন প্লাসে আমি শুরু করেছি ডাবল কোট দিয়ে শেষ করেছি সিঙ্গেল কোট দিয়ে। তারপর প্লাস উধাও হয়ে গেলো কারন কি চিন্তা করেন। তারপর a টাইপ করার পর আউটপুট দেখাইলো kinley free\"\n\"kinley freeএইটা আবার কি? আউটপুটে খেয়াল করুন kinley free তারপর \" এই ব্যাকস্লাশ এর কাজ সে তার ঠিক পরে সিঙ্গেল বা ডাবল কোটকে স্কিপ করে যায়। তারপর \n মানে নিউ লাইন তারপর আবার ব্যাকস্লাশ। পরবর্তিতে সে যখন একটা সিঙ্গেল কোটেশন পেল। তখন ভাবলো যে আমার স্ক্রিপটি বা লাইনটি শেষ হয়েছে এবং a লিখে এন্টার দেওয়াতে সে আউটপুট প্রদান করলো। এইবার আরেকটি উদাহরণ দেখিঃ

> a <- "kinley'

+ "free"

Error: unexpected symbol in:

"a <- "kinley'

"free"

এখানে ঘটনাটা কি হল এইবার দেখি ইরর দিলো আগেরববার কেন দিলো না! আসলে এখানে খেয়াল করে দেখুন প্রথমে ডাবল কোটেশন দিয়ে শুরু করলাম পরে সিঙ্গেল কোটেশন দিলাম বিধায় সে বুঝতে পারলো না স্ক্রিপ্ট শেষ হইছে কিনা সেজন্য + ধরাইয়া দিলো। তারপর আমরা লিখলাম "free" এখানে কিন্তু ডাবল কোটেশান আছে দুই জায়গায় তাই সে বুঝতে পারলো না লাইন কোণ জায়গায় শেষ।তাই এরর দিলো। আরেকটা কথা আমরা যদি শুরুটা ডাবল কোট বা সিঙ্গেল কোট যাই দিয়া শুরু করি না কেন আর যদি কেউ ভুল করে প্রেমে পরে + সিম্বলের দাওয়াত পেয়ে যাই সেক্ষেত্রে আমরা যেই কোটেশন দিয়া শুরু করছি সে কোটেশান যদি আর ব্যবহারিত না করি তাহলে + আপনারে ছাড়বে নিচে কোড দেখলে প্রেমে পরা বন্ধ হবে।

> a <- "kinley'

+ 'kinley'

+ 'free'

+ 'na'

+ 'kinley'

+ 'dhora'

খেয়াল করেছেন + কিন্তু আর ছাড়লই না। কারন শুরু করেছি ডাবল দিয়ে আর কোথাও ডাবলই দিলাম না। তাহলে আজীবন + এর প্রেমে পরে তেরে নাম হতে হবে। যাইহোক এক্ষেত্রে আমাদের সচেতন হওয়াই বাঞ্চনীয়। আরেকটা কথা আমরা অনেক সময় অনলাইন জাজে আর দিয়ে কোড করার চেষ্টা চালাইতেই পারি। তাই কিছু জিনিস দেখাইয়া রাখি আপনি নিউ লাইন, ব্যাকস্লাশ প্রিন্ট কিংবা ট্যাব ( চারটা স্পেস) এর কাজগুলা print() ফাংশনের দ্বারা করতে পারবেন না। এজন্য আপনাকে cat() ফাংশনের স্বরনাপন্ন হতে হবে।

> print('Vip\nNote\n')

[1] "Vip\nNote\n"

> cat('Vip\nNote\n')

Vip

Note

> cat('\\')

\

> cat('hello\tworld')

hello world

print() এর ভিতরে যা দিলেন স্ট্রিং হিসাবে তাই প্রিন্ট করে দেখাইয়া দিলো আর আমরা cat() ব্যবহার করাতে সুন্দর মত আউটপুট গুলা দেখাইয়া দিলো। এজন্য আমরা kinley free এর উদাহরনে হযবড়ল অবস্থায় পড়েছিলাম। cat() ফাংশন দিয়ে আরো মজার মজার কাজ করা যায় তা পড়ে আলোচনা করলে বোধগম্য হবে।

ক্যারেক্টারের ভ্যালু এক্সসেস

অন্যান্য প্রোগ্রামিং ভাষার মতন আর প্রোগ্রামিং এ ইনডেক্স ধরে ধরে ক্যারেক্টার একসেস করতে পারবেন। কিন্তু আর প্রোগ্রামিং এ অনেক একটু ভিন্ন এবং কঠিন বলা যেতে পারে। তবে ভয়ের কিছুই নেই। আমরা মনোযোগ দিয়ে অনুশীলন করলে পেরে যাবো। তাহলে চলুন দেখে ফেলি

> a <- "Bangladesh"

> print(substr(a, start = 2, stop = 2))

[1] "a"

এখানে প্রথমে 'a' ভ্যারিয়েবলের ভিতর "Bangladesh" ক্যারেক্টার নিলাম। তারপর আমরা প্রিন্ট এর ভিতর লিখলাম (substr(a, start = 2, stop = 2))। এখানে substr() এর ফাংশনের ভিতরে লিখলাম a ভ্যারিয়েবলের দুই নাম্বার ইনডেক্স থেকে দুই নাম্বার ইনডেক্স পর্যন্ত ভ্যালুটা দেখাতে। সে আউটপুটে "a" দেখালো। আর প্রোগ্রামিং এ ইনডেক্স 1 থেকে শুরু এটা মনে রাখতে হবে। এভাবে আমরা চাইলে ২ থেকে ৫ নাম্বার ভ্যালু দেখাতে পারতাম শুধু stop = 2 কে পরিবর্তন করে 5 করে দিলেই হয়। এইবার আমরা উপরের কোড আরেকটু ছোট করবো।

> a <- "Bangladesh"

> print(substr(a,2,5))

[1] "angl"

start এবং stop কে উঠিয়ে দিলাম। আসলে লিখার প্রয়োজন পরে না। বুঝার সুবিধার্থে প্রথমে লিখেছিলাম।

ক্যারেক্টারের মশলা

print() দিয়ে আমরা কোন কিছু দেখার জন্য ব্যবহার করি। এইবার ধরুন আবুলের বংশের টাইটেল বা উপাধি হল মাল। আমরা ইংরেজীতে লিখবো আপনার নাম এর পর টাইটেল এবং প্রিন্ট করে দেখবো।

> print('Abul\'s family title is Mal')

[1] "Abul's family title is Mal"

কিন্তু যদি বলি a <- 'Mal' ডিক্লেয়ার করে তারপর Abul's family title is এই ক্যারেক্টারের সাথে a এর ভ্যালুটা যুক্ত করতে হবে সেক্ষেত্রে কোড লিখতে বসে পড়বো।

> a <- 'Mal'

> print('Abul\'s family title is',a)

Error in print.default("Abul's family title is", a) :

invalid 'digits' argument

In addition: Warning message:

In print.default("Abul's family title is", a) : NAs introduced by coercion

এরর ছাড়া আর কিছুই দিবে না। এই কাজটা আমরা কয়েক ভাবেই করতে পারি। প্রথমে আসি কেউ যদি সি প্রোগ্রামিং করে থাকি তাহলে ফরম্যাটিং এর সাথে আশা করি পরিচিতি হয়েছেন। যেমন int এর জন্য লিখতেন %d কিংবা স্ট্রিং এর জন্য %s এইগুলাই হইলো ফরম্যাটিং। আর প্রোগ্রামিং এ এই ফরম্যাটিং ব্যবহার করা যায়। তবে এইক্ষেত্রে এইকাজটা করা যায় sprintf() এর দ্বারা।

> a <- 'Mal'

> sprintf('Abul\'s family title is %s',a)

[1] "Abul's family title is Mal"

print() ব্যবহার করলে এরর খাবেন। তবে print() এর ভিতরে sprintf() লাইন ঢুকাইতে পারেন।

> a <- 'Mal'

> print(sprintf('Abul\'s family title is %s',a))

[1] "Abul's family title is Mal"

এইভাবে ইন্টিজার এর জন্য %d এবং ডাবলের জন্য %f লিখতে পারবেন। যেমনঃ

> a = 23

> sprintf('Number is %d',a)

[1] "Number is 23"

> b = 3.1213

> sprintf('Number is %f',b)

[1] "Number is 3.121300"

> sprintf('Number is %.2f',b)

[1] "Number is 3.12"

এখানে সবার শেষে %.2f লিখলাম যাতে দশমিকের পর আমাকে দুই ঘড় প্রিন্ট করে দেখায়।

এবার আসি আরেকটা চমৎকার উপায় দিয়ে কিভাবে করা যায় আমরা এক্ষেত্রে paste() ফাংশন ব্যবহার করবো। ঝটপট দেখা যাকঃ

> a <- 'Mal'

> print(paste('Abul\'s family title is',a))

[1] "Abul's family title is Mal"

ক্যারেক্টারের সাথে ক্যারেক্টারের মিলন

কিভাবে একটা ক্যারেক্টারের সাথে আরেকটা ক্যারেক্টারের বা ততোধিক ক্যারেক্টারের মিলন ঘটাবো সেটা দেখবো আমরা।

> a <- 'Sam'

> b <- 'sung'

এই a এবং b কে জোড়া দিতে পারলে ঘরে ঘরে থাকা ফোন কোম্পানীর নাম বের হয়ে আসবে। এক্ষেত্রে আমরা paste() ফাংশনই ব্যবহার করবো তবে paste(a,b) ব্যবহার করলে কি হবে সেটা আগে দেখবো।

> a <- 'Sam'

> b <- 'sung'

> paste(a,b)

[1] "Sam sung"

আউটপুট খেয়াল করুন আমরা চেয়েছিলাম 'Sam' এবং 'sung' এর মাঝে মিলন করে দিতে। কিন্তু মিলন ঠিকই হলো সমস্যা থেকে গেলো 'Sam' এবং 'sung' এর মাঝে একটা স্পেস এসে। আমরা কিন্তু বলে দেই নাই মিলনটা কি রকম হবে। নিচের উদাহরণ দেখি হজম হবে

> a <- 'Sam'

> b <- 'sung'

> paste(a,b,sep='')

[1] "Samsung"

এখানে sep টা হল Separation অর্থাৎ বিচ্ছেদ। a এবং b কে আমরাsep=''এর মাধ্যমে বলে দিলাম তাদের মাঝে যাতে কোন স্পেস না থাকে। sep = '' এর ভিতর যেকোন সিম্বল ব্যবহার করে আপনি বিচ্ছেদ করতে পারেন। যেমন আরেকটি উদাহরণ দেখি। ধরুন Jhon Cena এর একটা আইডি আছে যেটা এরকম Jhon_Cena এটাকে আমরা আউটপুট হিসাবে কাজে লাগাবো। চলুন দেখি

> a <- 'Jhon'

> b <- 'Cena'

> paste(a,b,sep='_')

[1] "Jhon_Cena"

অর্থাৎ আপনি sep='(এখানে আপনি আপনার ইচ্ছামত যেকোন সিম্বল ব্যবহার করতে পারেন')। নিজে করতে করতে শিখেন আমি এবার বিশ্রাম করি।

ক্যারেক্টার অদল বদল

এইবার আমরা একটা ইংরেজিতে বাক্য লিখবো “You only live once, but if you do it right, once is enough.”। ধরুন আপনার মর্জি হল এই বাক্যের যত জায়গায় 'i' আছে তা 'o' করে দিবেন। চলুন মর্জি পূরণ করি।

> morji = "You only live once, but if you do it right, once is enough."

> gsub('i','o',morji)

[1] "You only love once, but of you do ot roght, once os enough."

gsub() এর ভিতর প্রথমে কোন ক্যারেক্টার পরিবর্তন করবো তা দিলাম। তারপর পরিবর্তন করে কোন ক্যারেক্টার দিতে চাই সেটা দিবো। বেলাশেষে আমরা আমাদের ভ্যারিয়বলের নাম দিয়ে খেল খতম করলে বাকীটা gsub() করে নিবে। এইবার ধরুন "Division" কে পরিবর্তন করে "Dyvision" করতে অনেক ইচ্ছা করলো সেটা পূরণ করবো কিভাবে! যদি gsub() দিয়ে করি তাহলে কি হবে দেখে ফেলি

> x <- "Division"

> gsub('i','y',x)

[1] "Dyvysyon"

সে করে দিলো "Dyvysyon" কিন্তু আমরা তো এটা চাইনি। আসলে gsub() এর কাজ তো এরকমই করা যেটা উপরের উদাহরনে দেখেছি। এর থেকে উপায় কি ডাক্তার সাহেব। উপায় আছে দেখে ফেলি।

> x <- "Division"

> substr(x,2,2) <- 'y'

> x

[1] "Dyvision"

বাহ চমৎকার তো। কিন্তু কোড তো বুঝলাম না, না বুঝার কিছুই নেই! '<-' এই অপারেটর নিয়ে অপারেটর অধ্যায়ে আলোচনা করেছি এবং substr() নিয়ে আলোচনা হয়েছে। মাথা খাটান তাহলেই না প্রোগ্রামার হবেন। এবার আমরা আরেকটা চমৎকার নিয়ম দেখবো এখানে তো আমরা ইনডেক্সের সীমা বেধে দিয়েছি (2,2)। কিন্তু আমাদেরকে যদি বলা হয় '1234567890' এই ক্যারেক্টারের ৪ নম্বর ইনডেক্স থেকে শেষ অবধি 'MicTest' কথাটা রিপ্লেস হবে। সেক্ষেত্রে কি করবোঃ

> x <- "1234567890"

> substring(x,4) <- 'MicTest'

> x

[1] "123MicTest"

ছোট বেলার কথা মনে পড়ে গেলো ১২৩ মাইক্রোফোন টেস্টিং।substr() এবং substring() এর মধ্যে পার্থক্য এইটুকুই যে substr() এ সীমা বা রেঞ্জ বলে দিতে হয় যেটা substring() না বলে দিলেও কোড কাজ করবে। substring() এ রেঞ্জও বলে দেওয়া যায় substr() এর মত। নিজে কিছু চর্চা করুন, তাহলে মনে থাকবে।

ক্যারেক্টারকে বড়, ছোট করি

ধরুন মাঝে মাঝে মন চায় গার্লফ্রেন্ডের নামটা বড় হাতের কিংবা ছোট হাতের করি। নাম হল 'Rohima'। এই নামটাকে বড় হাতের এবং ছোট হাতের দুটাই করবো।

> gf <- 'Rohima'

> toupper(gf)

[1] "ROHIMA"

দিলাম বড় হাতের করে এইবার ছোট হাতের পালা। ছোট হাতের করার জন্য tolower() ফাংশন ব্যবহার করবো।

> gf <- 'Rohima'

> tolower(gf)

[1] "rohima"

results matching ""

    No results matching ""