একটি সেল আসলে কী সংরক্ষণ করে
স্প্রেডশিটের একটি সেলে দুটি আলাদা জিনিস থাকে: একটি মান (value) আর একটি নম্বর ফরম্যাট। 0.15 মানটি দেখা যেতে পারে 15% হিসেবে, 0.15 হিসেবে, £0.15 হিসেবে বা 15.00% হিসেবে — কিন্তু এর কোনোটিই মানটিকে এক চুলও বদলায় না। স্প্রেডশিট নিয়ে এটিই সবচেয়ে কাজের তথ্য, আর এ কারণেই “Excel থেকে CSV” আন্দাজ না করে আপনাকে “Excel-এ যেমন দেখায়” আর “কাঁচা সংখ্যা, ISO তারিখ”-এর মধ্যে বেছে নিতে বলে। “Excel-এ যেমন দেখায়” হুবহু পর্দার লেখাটি লেখে — 15/03/2024, 1,234.50, 12% — Excel-এর নিজের Save As যা করে, আর CSV পড়া একজন মানুষ যা আশা করেন। “কাঁচা সংখ্যা, ISO তারিখ” লেখে সাধারণ সংখ্যা আর ISO তারিখ — যা একটি ডেটাবেস বা স্ক্রিপ্ট আশা করে। ভুলটি বাছলে ইমপোর্ট এমনভাবে ব্যর্থ হয় যে মনে হয় ডেটাই নষ্ট হয়ে গেছে।
তারিখ আসলে সংখ্যা, শুধু তারিখের ছদ্মবেশে। তারিখের সেলে থাকে দিনের একটি ক্রমিক গণনা, আর কোন দিন থেকে গোনা শুরু হবে (epoch), তা ফাইলের ওপর নির্ভর করে: Windows-এর Excel-এ লেখা ওয়ার্কবুক গোনে ১৯০০ থেকে, পুরোনো Mac Excel-এর ওয়ার্কবুক গোনে ১৯০৪ থেকে, আর দুটির মধ্যে ব্যবধান ১,৪৬২ দিন। ১৯০০ পদ্ধতিটি আরও অদ্ভুত — এটি ধরে নেয় যে ২৯ ফেব্রুয়ারি ১৯০০ বলে একটি দিন ছিল; এই বাগটি এসেছে Lotus 1-2-3 থেকে, আর সামঞ্জস্যের খাতিরে তখন থেকেই রেখে দেওয়া হয়েছে। এখানকার টুলগুলো প্রতিটি ওয়ার্কবুকের নিজস্ব epoch ফ্ল্যাগ পড়ে এবং নকল অধিবর্ষ-দিনটিকে ঠিক যেখানে থাকার কথা সেখানেই রাখে — এ কারণেই এখানে কনভার্ট করা তারিখ চার বছর এক দিন সরে না গিয়ে Excel যা দেখায় তার সঙ্গে মিলে যায়।
ফর্মুলা আর তার ফলাফল পাশাপাশি সংরক্ষিত থাকে। একটি ওয়ার্কবুক ফর্মুলার লেখা আর সর্বশেষ হিসাব করা মান — দুটোই রাখে। ওয়ার্কবুক থেকে ওয়ার্কবুকে কনভার্শন — ODS থেকে XLSX, XLS থেকে XLSX, XLSX থেকে ODS — ফর্মুলাগুলোই নিয়ে যায়, দুই পক্ষের ফাংশনের ভাষার মধ্যে অনুবাদ করে; ফলে এডিট করলে শিট আবার হিসাব করে। যে অল্প কয়েকটি ফাংশন শুধু এক পক্ষেই আছে, সেগুলো বদলে না দেওয়া পর্যন্ত #NAME? দেখায়। আর যা কিছু স্প্রেডশিটের জগৎ ছেড়ে বেরিয়ে যায় — CSV, JSON, XML — তা শুধু হিসাব করা ফলাফলটিই নেয়, কারণ এই ফরম্যাটগুলোর কোনোটিতেই ফর্মুলা বলে কোনো ধারণা নেই।
একটি ওয়ার্কবুকের বেশির ভাগ জিনিসই CSV ধারণ করতে পারে না, আর তা না মেনে নিলেই ডেটা হারায়। এতে শিট বলে কিছু নেই, তাই প্রতিটি শিট আলাদা ফাইল হয় (সবগুলো চাইলে একটি ZIP)। এতে সেলের ধরন নেই, তাই কেউ আন্দাজ না করা পর্যন্ত প্রতিটি ফিল্ডই টেক্সট। এতে ফরম্যাট, ফর্মুলা, চার্ট, ছবি, রং, কলামের প্রস্থ — কিছুই নেই। মার্জ করা সেলের একটা সমাধান করতেই হয় — হয় মানটি প্রথম সেলে, নয়তো পুরো মার্জ অংশে বারবার। আর এটি নিজের ডেলিমিটার, দশমিক চিহ্ন বা এনকোডিং কোথাও লিখে রাখে না — এ কারণেই দশমিকের জায়গায় কমা থাকা ইউরোপীয় সেমিকোলন-ফাইল মার্কিন Excel-এ একটিমাত্র কলামে এসে পড়ে, আর ফাইলের শুরুতে বাইট-অর্ডার মার্ক (BOM) না থাকলে অ্যাকসেন্টওয়ালা অক্ষর দুর্বোধ্য হিজিবিজি হয়ে যায়।
দেখতে সংখ্যার মতো টেক্সটেই আসল ক্ষতি হয়। CSV খোলার সময় Excel প্রতিটি সেল আলাদা করে আন্দাজ করে: 01234 ZIP কোডের শূন্যটি হারিয়ে যায়, ১৬ অঙ্কের অর্ডার আইডি হয়ে যায় 1.23457E+15 এবং আর ফেরানো যায় না, আর SEPT2 নামের জিনটি হয়ে যায় একটি তারিখ — সমস্যাটি এতটাই গুরুতর যে জিনতত্ত্ববিদেরা তাঁদের জিনের নামই বদলে ফেলেছেন। “CSV থেকে Excel” এর বদলে প্রতিটি কলামের জন্য একবারই সিদ্ধান্ত নেয়, কলামের সব মান দেখে, আর কনভার্ট করে কেবল তখনই যখন পুরো কলাম একমত; শুরুতে শূন্য আছে এমন যেকোনো কিছু, আর JavaScript-এর সংখ্যায় হুবহু ধরে না এমন লম্বা যেকোনো পূর্ণসংখ্যা টেক্সটই থেকে যায়। “JSON থেকে CSV” উল্টো দিকে একই যত্ন নেয় — বেশির ভাগ কনভার্টার যেখানে ৬৪-বিট আইডি রাউন্ড করে ফেলে, সেখানে এটি প্রতিটি অঙ্ক হুবহু কপি করে।
JSON আর XML প্রত্যেকে নিজস্ব কিছু বাদ দেয়। JSON-এ তারিখের কোনো ধরনই নেই, তাই তারিখ যায় টেক্সট হিসেবে, আর যে কোড সেটি গ্রহণ করে তাকে জানতে হয় সে কী দেখছে। ডেটা XML শুধু মানগুলো বহন করে — ফরম্যাটিং, চার্ট বা ছবি ছাড়া; ইমপোর্ট ফিডের ঠিক এটাই দরকার, কিন্তু ওয়ার্কবুক অক্ষত রাখাই যদি উদ্দেশ্য হয়, তাহলে এটা আপনার চাওয়া নয়।
যেখানে ব্রাউজার সত্যিই ভুল টুল
এর মধ্যে সাতটি টুল আপনার ফাইল কোথাও পাঠায় না: Excel থেকে CSV, CSV থেকে Excel, CSV থেকে JSON, JSON থেকে CSV, XML থেকে Excel, Excel থেকে XML ও PDF থেকে Excel। কিছুই সংরক্ষণ করা হয় না — ফাইলটি বেতনের তালিকা বা গ্রাহকের তালিকা হলে এটা জরুরি। চারটি আলাদা — Excel থেকে PDF, ODS থেকে XLSX, XLS থেকে XLSX ও XLSX থেকে ODS ফাইলটি আমাদের সার্ভারে দেয়, কারণ প্রিন্টের পেজ সাজানো, কিংবা ফন্ট, রং, কন্ডিশনাল ফরম্যাটিং আর চার্ট এক ফরম্যাট থেকে আরেক ফরম্যাটে নেওয়া — এমন কাজ একটি ওয়েব পেজ ভান করে সেরে দিতে পারে না। এই ফাইলগুলো এনক্রিপ্টেড সংযোগে যায়, কনভার্ট হয়, আর আপনার ডাউনলোড তৈরি হওয়ার সঙ্গে সঙ্গেই মুছে ফেলা হয়। সার্ভারে পৌঁছানো না গেলে প্রতিটি টুল নিজের কনভার্টারে ফিরে যায় — যা মান, ফর্মুলা, নম্বর ফরম্যাট, মার্জ করা সেল ও কলামের প্রস্থ রাখে, কিন্তু ফন্ট, রং বা চার্ট রাখে না — এবং আপনাকে জানিয়ে দেয় যে এমনটি করেছে।
সাইজ। ব্রাউজারে চলা টুলগুলো পুরো টেবিল মেমরিতে রাখে, তাই সীমা হলো আপনার ট্যাবের মেমরি — কয়েক দশ মেগাবাইট পর্যন্ত স্বচ্ছন্দ, একশোর বেশি হলে ঝামেলা, আর কয়েক গিগাবাইটের এক্সট্র্যাক্টের জন্য একেবারেই অচল। ওয়ার্কবুক কনভার্টারগুলোর সীমা প্রতি ফাইলে ৫০ MB, আর Excel থেকে PDF-এর ৪০ MB — দুটোই কনভার্টের পরে নয়, আগেই তা জানিয়ে দেয়। একটি Excel শিট নিজেই ১০,৪৮,৫৭৬ সারিতে থেমে যায় — এটি ফরম্যাটের সীমা, আমাদের নয়; “CSV থেকে Excel” নিঃশব্দে ডেটা কেটে না ফেলে হেডার আবার বসিয়ে বাড়তি শিটে চালিয়ে যায়।
সত্যিকারের ডেটার কাজ। কনভার্টার কোনো ডেটাবেস নয়। দুটি টেবিল জোড়া দেওয়া, ডুপ্লিকেট সরানো, যোগফল বের করা, এক কোটি সারি ফিল্টার করা বা এলোমেলো এক্সপোর্ট খুঁটিয়ে দেখা — এসব কাজ সেই কাজের জন্য তৈরি টুলের, আর বিনামূল্যের টুলগুলো খুবই ভালো: কমান্ড লাইনে দ্রুত CSV কাটাছেঁড়ার জন্য csvkit, JSON আর CSV একসাথে একই কাজের জন্য Miller, বিশাল ফাইলে গতির জন্য qsv, CSV বা Parquet ফাইলের ওপর সরাসরি আসল SQL চালাতে DuckDB, আর আপনি আগে থেকেই Python-এ থাকলে pandas।
ম্যাক্রো, আর যা কিছু চলে। VBA .xlsx-এ নেওয়া যায় না — সেখানে এটি রাখার কোনো জায়গাই নেই; আর .ods-এও নেওয়া হয় না, কারণ LibreOffice VBA-র শুধু একটা অংশ চালায়, আর পার্থক্যগুলো ত্রুটি হিসেবে নয়, ভুল সংখ্যা হিসেবে দেখা দিত। কোনো ওয়ার্কবুক যদি তার ম্যাক্রোর ওপর নির্ভর করে, কনভার্ট করা কপির পাশাপাশি মূল ফাইলটিও রেখে দিন। পাসওয়ার্ড দেওয়া ফাইলের পাসওয়ার্ড আগে সরিয়ে নিতে হবে — যে প্রোগ্রামে সেটি দেওয়া হয়েছিল, সেখানেই।
অটোমেশন। এই টুলগুলো চলে যখন একজন মানুষ ক্লিক করেন। প্রতি রাতের ফিড কনভার্ট করা কমান্ড লাইনের কাজ: হেডলেস মোডে LibreOffice এই পেজের প্রতিটি ফরম্যাট সামলাতে পারে।
একই রকম শোনায় এমন টুলগুলোর মধ্যে বাছাই
Excel থেকে CSV বনাম Excel থেকে XML। দুটিই একটি ওয়ার্কবুক পড়ে একটি সমতল ডেটা ফাইল লেখে, আর কোনটি নেবেন তা ঠিক করে ফাইলটি কোথায় যাবে। CSV যায় স্প্রেডশিট, ডেটাবেস আর যা কিছু বলে “একটি CSV আপলোড করুন” সেখানে। XML যায় এমন ইমপোর্ট ও ইন্টিগ্রেশনে, যেগুলো এলিমেন্টের নাম নির্দিষ্ট করে দেয় — আপনি রুট আর সারির নাম ঠিক করেন, হেডারগুলো হয় এলিমেন্টের নাম, আর মান আসে সাধারণ সংখ্যা ও ISO তারিখ হিসেবে। “Excel থেকে XML” XML Spreadsheet 2003-ও লিখতে পারে, যা সম্পূর্ণ আলাদা জিনিস: এমন একটি ফরম্যাট যা Excel আবার ওয়ার্কবুক হিসেবে খোলে — যখন কোনো সিস্টেম আপনার নিজের ডেটা XML নয়, “Excel XML” চায়।
CSV থেকে Excel বনাম CSV থেকে JSON। একই পার্সার, প্রতি কলামে একই ধরন শনাক্তকরণ, আউটপুট আলাদা। “CSV থেকে Excel” তৈরি করে একটি .xlsx, যাতে আছে সত্যিকারের তারিখ ও সংখ্যা, যা যোগ ও সাজানো যায়, আর একটি ফ্রিজ করা, ফিল্টারযোগ্য হেডার সারি — মানুষের জন্য। “CSV থেকে JSON” তৈরি করে অবজেক্টের অ্যারে, অ্যারের অ্যারে, কি-যুক্ত অবজেক্ট বা JSON Lines — কোডের জন্য। উত্তর যদি হয় “দুটোই”, মানুষের জন্য Excel-এ আর পাইপলাইনের জন্য JSON-এ কনভার্ট করুন; দুটো মিলে যাবে, কারণ কলামের ধরন একইভাবে ঠিক করা হয়েছে।
XML থেকে Excel বনাম Excel থেকে XML। শুধু উল্টো দিক নয়। “XML থেকে Excel”-কে আগে টেবিলটি খুঁজে বের করতে হয়: এটি একই প্যারেন্টের নিচে বারবার আসা এলিমেন্ট খোঁজে — ক্যাটালগের প্রতিটি <book>, RSS ফিডের প্রতিটি <item> — প্রতিটি গ্রুপকে নম্বর দেয়, বাকিগুলো এক ক্লিক দূরে রাখে, তারপর অ্যাট্রিবিউট আর নেস্টেড এলিমেন্টকে পাথ-নামের কলামে সমতল করে। “Excel থেকে XML”-এর কিছু খুঁজতে হয় না, কারণ আপনার সারিগুলোই রেকর্ড।
XLS থেকে XLSX বনাম CSV থেকে Excel। দুটিরই শেষ একটি আধুনিক ওয়ার্কবুকে। “XLS থেকে XLSX” একটি সত্যিকারের Excel 97–2003 বাইনারি ফাইলকে আপগ্রেড করে এবং তার সবকিছু রাখে — শিট, ফর্মুলা, ফরম্যাটিং, চার্ট। “CSV থেকে Excel” এমন সাধারণ টেক্সট থেকে ওয়ার্কবুক বানায়, যার কখনো এসবের কিছুই ছিল না। দুটোর মাঝামাঝি বিরক্তিকর একটি ক্ষেত্র আছে: অনেক ওয়েব অ্যাপ একটি HTML টেবিল বা XML ফাইল এক্সপোর্ট করে তার নাম দেয় .xls। “XLS থেকে XLSX” এগুলোর আসল পরিচয় চিনে নেয় এবং একটি সত্যিকারের ওয়ার্কবুক সেভ করে।
PDF থেকে Excel বনাম Excel থেকে PDF। উল্টো দিক, আর এদের মধ্যে কেবল একটি নির্ভরযোগ্য। “Excel থেকে PDF” লেআউটের কাজ: ওয়ার্কবুক আগে থেকেই তার প্রিন্ট এরিয়া, পেজ ব্রেক আর ফরম্যাটিং জানে, কনভার্টার শুধু সেগুলো আঁকে। “PDF থেকে Excel” কঠিন দিক, কারণ PDF লিখে রাখে প্রতিটি অক্ষর কোথায় আঁকা হয়েছিল, কিন্তু সেটি কোন সেলের ছিল সে সম্পর্কে কিছুই নয় — কলামগুলো অবস্থান দেখে অনুমান করা হয়। দাগ টানা পরিষ্কার টেবিলে এটি ভালো কাজ করে, যেখানে সেল মার্জ করা বা কয়েক লাইনে ভেঙে গেছে সেখানে গুছিয়ে নিতে হয়, ফরম্যাটিং বা ফর্মুলা নয়, মানগুলো আবার তৈরি করে, আর PDF-এর প্রতিটি পেজকে আলাদা শিট দেয়। মূল ওয়ার্কবুক এখনো থাকলে সেটিই চেয়ে নিন।
.ods ফাইলের জন্য ODS থেকে XLSX বনাম Excel থেকে CSV। “Excel থেকে CSV” স্বচ্ছন্দে .ods খোলে এবং মানগুলো দেয়। “ODS থেকে XLSX” ওয়ার্কবুককে ওয়ার্কবুক হিসেবেই রাখে — ফর্মুলা, ফরম্যাটিং আর চার্টসহ। কাউকে ফাইলটিতে কাজ করতে হলে কনভার্টার ব্যবহার করুন, আর কোনো সিস্টেমের যদি এর থেকে শুধু সংখ্যাগুলো দরকার হয়, তাহলে CSV-র পথ।