CSV to JSON JavaScript — Converter + Code Examples
বিনামূল্যে অনলাইন CSV থেকে JSON সরাসরি আপনার ব্রাউজারে ব্যবহার করুন — ইনস্টলের প্রয়োজন নেই।
CSV থেকে JSON অনলাইনে ব্যবহার করুন →আমি যে বেশিরভাগ CSV ডেটার সাথে কাজ করি তা একটি ফাইল আপলোড, একটি ডেটাবেস এক্সপোর্ট, বা একটি API থেকে ফ্ল্যাট স্ট্রিং হিসেবে আসে। JavaScript-এ CSV থেকে JSON রূপান্তর করতে, আপনার দুটি জিনিস দরকার যা ভাষায় built-in: সারি পার্স করতে string split এবং ফলাফল সিরিয়ালাইজ করতে JSON.stringify()। মূল বিষয়গুলির জন্য কোনো npm প্যাকেজের প্রয়োজন নেই — এই গাইডটি একটি পুনর্ব্যবহারযোগ্য csvToJson() ইউটিলিটি থেকে PapaParse এবং Node.js ফাইল I/O পর্যন্ত সম্পূর্ণ পাইপলাইন কভার করে। কোড ছাড়া দ্রুত রূপান্তরের জন্য, অনলাইন CSV থেকে JSON কনভার্টার তাৎক্ষণিকভাবে পরিচালনা করে। সমস্ত উদাহরণ Node.js 18+ এবং আধুনিক ব্রাউজারকে লক্ষ্য করে।
- ✓CSV-কে নতুন লাইন দিয়ে বিভক্ত করুন, সারি 0 থেকে হেডার বের করুন, অবশিষ্ট সারিগুলিকে অবজেক্টে ম্যাপ করুন, তারপর সুন্দর আউটপুটের জন্য JSON.stringify(array, null, 2)।
- ✓JSON.stringify() একটি স্ট্রিং তৈরি করে; JSON.parse() এটিকে লাইভ JavaScript অ্যারেতে ফিরিয়ে রূপান্তর করে — অপারেশন করার আগে কোনটি আছে তা জানুন।
- ✓Map ইনস্ট্যান্স স্বয়ংক্রিয়ভাবে JSON-এ সিরিয়ালাইজ হয় না — আগে Object.fromEntries(map) কল করুন।
- ✓কোটেড ফিল্ড, মানের মধ্যে কমা, বা সেলে নতুন লাইনসহ CSV-এর জন্য, ম্যানুয়াল বিভাজনের পরিবর্তে PapaParse বা csv-parse ব্যবহার করুন।
- ✓csvtojson (npm) একটি একক কলে টাইপ জোরপূর্বক রূপান্তর, স্ট্রিমিং, এবং RFC 4180 এজ কেস পরিচালনা করে।
CSV থেকে JSON রূপান্তর কী?
CSV থেকে JSON রূপান্তর একটি ফ্ল্যাট, কমা-বিভক্ত টেক্সট ফরম্যাটকে একটি কাঠামোবদ্ধ অবজেক্টের অ্যারেতে রূপান্তরিত করে যেখানে প্রতিটি সারি কলাম হেডার দ্বারা কী করা একটি JavaScript অবজেক্ট হয়ে ওঠে। CSV ফরম্যাটের কোনো ডেটা টাইপ নেই — সবকিছু একটি স্ট্রিং। JSON কাঠামো, নেস্টিং এবং সুস্পষ্ট টাইপ (সংখ্যা, বুলিয়ান, null) যোগ করে। এই রূপান্তর প্রায় প্রতিটি ডেটা পাইপলাইনের প্রথম ধাপ যা একটি স্প্রেডশিট এক্সপোর্ট, একটি পুরানো সিস্টেম ডাম্প, বা একটি ব্যবহারকারী-আপলোড করা ফাইল দিয়ে শুরু হয়। অন্তর্নিহিত ডেটা একই থাকে; ফরম্যাটটি অবস্থান-ভিত্তিক কলাম থেকে নামযুক্ত প্রপার্টিতে পরিবর্তিত হয়।
name,email,role,active রাহুল দাস,rdas@nexuslabs.io,Engineering Lead,true প্রিয়া সেন,psen@nexuslabs.io,Product Manager,true
[
{
"name": "রাহুল দাস",
"email": "rdas@nexuslabs.io",
"role": "Engineering Lead",
"active": "true"
},
{
"name": "প্রিয়া সেন",
"email": "psen@nexuslabs.io",
"role": "Product Manager",
"active": "true"
}
]csvToJson() — একটি পুনর্ব্যবহারযোগ্য রূপান্তর ফাংশন তৈরি করা
JavaScript-এ সম্পূর্ণ CSV-থেকে-JSON পাইপলাইন তিনটি ধাপে বিভক্ত: সারি পেতে CSV স্ট্রিংকে নতুন লাইন দিয়ে বিভক্ত করুন, split(',') দিয়ে প্রথম সারি থেকে হেডার বের করুন, তারপর প্রতিটি অবশিষ্ট সারিকে একটি সাধারণ JavaScript অবজেক্টে ম্যাপ করুন যেখানে কীগুলি হেডার থেকে আসে এবং মানগুলি সংশ্লিষ্ট কলাম অবস্থান থেকে আসে। JSON.stringify() এর চূড়ান্ত কল সেই অবজেক্টের অ্যারেটিকে JSON স্ট্রিংয়ে রূপান্তরিত করে। এখানে একটি ন্যূনতম কার্যকরী সংস্করণ:
function csvToJson(csv) {
const lines = csv.trim().split('\n')
const headers = lines[0].split(',').map(h => h.trim())
const rows = lines.slice(1)
.filter(line => line.trim() !== '')
.map(line => {
const values = line.split(',')
return Object.fromEntries(
headers.map((header, i) => [header, values[i]?.trim()])
)
})
return JSON.stringify(rows, null, 2)
}
const csv = `server,port,region,status
api-gateway,8080,us-east-1,healthy
auth-service,8443,eu-west-1,degraded
payments-api,9090,ap-south-1,healthy`
console.log(csvToJson(csv))
// [
// { "server": "api-gateway", "port": "8080", "region": "us-east-1", "status": "healthy" },
// { "server": "auth-service", "port": "8443", "region": "eu-west-1", "status": "degraded" },
// { "server": "payments-api", "port": "9090", "region": "ap-south-1", "status": "healthy" }
// ]সেই ফাংশনটি মূল বিষয়গুলি পরিচালনা করে: ট্রেইলিং নতুন লাইন, খালি লাইন, মানের চারপাশে হোয়াইটস্পেস। প্রতিটি CSV ফিল্ড একটি স্ট্রিং হিসেবে আসে। লক্ষ্য করুন যে port হল "8080" (একটি স্ট্রিং), না 8080 (একটি সংখ্যা)। JSON আউটপুটে সঠিক টাইপ দরকার হলে, আপনাকে নিজেই সেগুলি জোর করে রূপান্তর করতে হবে। এখানে টাইপ সনাক্তকরণ সহ একটি বর্ধিত সংস্করণ:
function coerceValue(val) {
if (val === undefined || val === '') return null
if (val === 'true') return true
if (val === 'false') return false
if (val === 'null') return null
const num = Number(val)
if (!isNaN(num) && val.trim() !== '') return num
return val
}
function csvToJson(csv, { coerce = false } = {}) {
const lines = csv.trim().split('\n')
const headers = lines[0].split(',').map(h => h.trim())
const rows = lines.slice(1)
.filter(line => line.trim() !== '')
.map(line => {
const values = line.split(',')
return Object.fromEntries(
headers.map((header, i) => [
header,
coerce ? coerceValue(values[i]?.trim()) : values[i]?.trim()
])
)
})
return JSON.stringify(rows, null, 2)
}
const csv = `endpoint,port,max_connections,debug
/api/v2/orders,8443,500,true
/api/v2/health,8080,100,false`
console.log(csvToJson(csv, { coerce: true }))
// [
// { "endpoint": "/api/v2/orders", "port": 8443, "max_connections": 500, "debug": true },
// { "endpoint": "/api/v2/health", "port": 8080, "max_connections": 100, "debug": false }
// ]coerce ফ্ল্যাগটি অপ্ট-ইন কারণ স্বয়ংক্রিয় টাইপ সনাক্তকরণ উল্টো হতে পারে — একটি জিপ কোডের মতো ফিল্ড ("07302") সংখ্যায় রূপান্তরিত হলে তার শুরুর শূন্য হারায়। ডিফল্টরূপে জোরপূর্বক রূপান্তর বন্ধ রাখুন এবং শুধুমাত্র তখনই সক্ষম করুন যখন আপনি স্কিমা নিয়ন্ত্রণ করেন। একটি দ্রুত নোট: JSON.stringify() ইন্ডেন্টেশনের জন্য একটি তৃতীয় space আর্গুমেন্ট গ্রহণ করে। দুই স্পেসের জন্য 2, চার স্পেসের জন্য 4, বা ট্যাবের জন্য "\t" পাস করুন। কমপ্যাক্ট একক-লাইন আউটপুটের জন্য সম্পূর্ণ বাদ দিন — API অনুরোধের বডি হিসেবে JSON স্ট্রিং পাঠানোর সময় উপকারী যেখানে হোয়াইটস্পেস শুধু ব্যান্ডউইথ নষ্ট করে।
JSON.parse() কল করলে SyntaxError থ্রো করে কারণ কমা এবং নতুন লাইন বৈধ JSON সিনট্যাক্স নয়। আপনাকে প্রথমে আপনার csvToJson() ফাংশন ব্যবহার করে CSV-কে JavaScript অবজেক্টে রূপান্তর করতে হবে, যা অভ্যন্তরীণভাবে প্রকৃত JSON স্ট্রিং তৈরি করতে JSON.stringify() কল করে।CSV ডেটা থেকে Maps, Dates এবং কাস্টম অবজেক্ট পরিচালনা করা
প্রতিটি CSV রূপান্তর সাধারণ অবজেক্টের ফ্ল্যাট অ্যারেতে শেষ হয় না। কখনো কখনো আপনাকে হেডার-মান জোড়া থেকে একটি Map তৈরি করতে হবে, তারিখ স্ট্রিং Date অবজেক্টে পার্স করতে হবে, বা সিরিয়ালাইজেশনের আগে গণনা করা প্রপার্টি সংযুক্ত করতে হবে। JavaScript-এ একটি সূক্ষ্মতা আছে যা মানুষকে বিভ্রান্ত করে: Map ইনস্ট্যান্সগুলি JSON.stringify() দিয়ে সিরিয়ালাইজ হয় না। আপনি একটি খালি অবজেক্ট পান। সমাধান হল স্ট্রিংফাই করার আগে Map-কে সাধারণ অবজেক্টে রূপান্তর করতে Object.fromEntries()।
Map {} তে সিরিয়ালাইজ হওয়ার কারণ হল JSON.stringify() একটি অবজেক্টের নিজস্ব গণনাযোগ্য প্রপার্টিগুলির উপর পুনরাবৃত্তি করে। একটি Map তার এন্ট্রিগুলি একটি অভ্যন্তরীণ স্লটে সংরক্ষণ করে, অবজেক্টে গণনাযোগ্য প্রপার্টি হিসেবে নয়, তাই সিরিয়ালাইজার কোনো কী ছাড়া একটি অবজেক্ট দেখে। Map প্রোটোটাইপেরও toJSON() পদ্ধতি নেই, যা JSON.stringify() সিরিয়ালাইজ করার আগে যেকোনো মানে প্রথমে কল করে। যদি কোনো মানে toJSON() থাকে, সেই পদ্ধতির রিটার্ন মান সিরিয়ালাইজ হয় — অবজেক্ট নিজে নয়। এই কারণেই Date অবজেক্ট সঠিকভাবে সিরিয়ালাইজ হয়: Date.prototype.toJSON একটি ISO 8601 স্ট্রিং রিটার্ন করে, তাই JSON.stringify(new Date()) একটি খালি অবজেক্টের পরিবর্তে একটি উদ্ধৃত টাইমস্ট্যাম্প তৈরি করে। এই হুক বোঝা আপনাকে আপনার নিজের ক্লাসে একই আচরণ সংজ্ঞায়িত করতে দেয় — নিচের EmployeeRecord উদাহরণে দেখানো হয়েছে — চূড়ান্ত JSON আউটপুটে ঠিক কোন CSV-থেকে-প্রাপ্ত ফিল্ডগুলি উপস্থিত হবে তা নিয়ন্ত্রণ করতে।
Map থেকে JSON-এ রূপান্তর
// CSV header→value জোড়া থেকে একটি Map তৈরি করুন
const headers = ['server', 'port', 'region']
const values = ['payments-api', '9090', 'ap-south-1']
const rowMap = new Map(headers.map((h, i) => [h, values[i]]))
// Map সরাসরি সিরিয়ালাইজ হয় না
console.log(JSON.stringify(rowMap))
// "{}" — খালি অবজেক্ট, ডেটা হারিয়ে গেছে!
// প্রথমে সাধারণ অবজেক্টে রূপান্তর করুন
const rowObj = Object.fromEntries(rowMap)
console.log(JSON.stringify(rowObj, null, 2))
// {
// "server": "payments-api",
// "port": "9090",
// "region": "ap-south-1"
// }তারিখ স্ট্রিং এবং toJSON()
CSV তারিখ ফিল্ড স্ট্রিং হিসেবে আসে। যদি আপনি প্রক্রিয়াকরণের সময় সেগুলিকে Date অবজেক্টে পার্স করেন, সেই Dates সঠিকভাবে সিরিয়ালাইজ হয় কারণ Date-এ একটি অন্তর্নির্মিত toJSON() পদ্ধতি আছে যা একটি ISO 8601 স্ট্রিং রিটার্ন করে। আপনি আপনার নিজের ক্লাসে কাস্টম toJSON() সংজ্ঞায়িত করতে পারেন যে কোন CSV কলামগুলি সিরিয়ালাইজড আউটপুটে উপস্থিত হবে তা নিয়ন্ত্রণ করতে — উদাহরণস্বরূপ, _rowIndex এর মতো অভ্যন্তরীণ ট্র্যাকিং ফিল্ড বাদ দিতে।
class EmployeeRecord {
constructor(csvRow) {
this._rowIndex = csvRow._rowIndex // অভ্যন্তরীণ, JSON-এর জন্য নয়
this.employeeId = csvRow.employee_id
this.name = csvRow.name
this.hiredAt = new Date(csvRow.hired_date)
this.salary = Number(csvRow.salary)
}
toJSON() {
// শুধুমাত্র যে ফিল্ডগুলি JSON আউটপুটে চাই সেগুলি প্রকাশ করুন
return {
employee_id: this.employeeId,
name: this.name,
hired_at: this.hiredAt, // Date.toJSON() → স্বয়ংক্রিয়ভাবে ISO স্ট্রিং
salary: this.salary,
}
}
}
const csvRow = {
_rowIndex: 42,
employee_id: 'EMP-2847',
name: 'রাহুল দাস',
hired_date: '2024-03-15',
salary: '128000',
}
const record = new EmployeeRecord(csvRow)
console.log(JSON.stringify(record, null, 2))
// {
// "employee_id": "EMP-2847",
// "name": "রাহুল দাস",
// "hired_at": "2024-03-15T00:00:00.000Z",
// "salary": 128000
// }
// নোট: _rowIndex বাদ দেওয়া হয়েছে, salary একটি সংখ্যা, তারিখ ISO ফরম্যাটেতারিখ ডিসিরিয়ালাইজেশনের জন্য Reviver
CSV-থেকে-প্রাপ্ত JSON একটি ফাইলে লেখার বা নেটওয়ার্কের মাধ্যমে পাঠানোর পরে, JSON.parse() আপনাকে আবার সাধারণ অবজেক্ট দেয় — Date অবজেক্টগুলি আবার স্ট্রিং হয়ে যায়। পার্সিংয়ের সময় ISO 8601 স্ট্রিংগুলিকে Date অবজেক্টে ফিরিয়ে রূপান্তর করতে একটি reviver ফাংশন ব্যবহার করুন:
const jsonString = '{"employee_id":"EMP-2847","name":"রাহুল দাস","hired_at":"2024-03-15T00:00:00.000Z","salary":128000}'
const isoDatePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/
const parsed = JSON.parse(jsonString, (key, value) => {
if (typeof value === 'string' && isoDatePattern.test(value)) {
return new Date(value)
}
return value
})
console.log(parsed.hired_at instanceof Date) // true
console.log(parsed.hired_at.getFullYear()) // 2024JSON.stringify() ফাংশন, Symbol, বা undefined প্রপার্টি ধারণকারী মানের জন্য undefined রিটার্ন করে (স্ট্রিং নয়)। যদি আপনার CSV-থেকে-প্রাপ্ত অবজেক্টগুলি একটি অনুপস্থিত কলাম থেকে ঘটনাক্রমে একটি undefined মান নেয়, সেই প্রপার্টিটি JSON আউটপুট থেকে নীরবে অদৃশ্য হয়ে যায়। সর্বদা অনুপস্থিত মানগুলিকে null হিসেবে ডিফল্ট করুন।JSON.stringify() প্যারামিটার রেফারেন্স
ফাংশন সিগনেচার হল JSON.stringify(value, replacer?, space?)। replacer এবং space আর্গুমেন্ট উভয়ই ঐচ্ছিক — যখন আপনার শুধুমাত্র ইন্ডেন্টেশন দরকার তখন replacer-এর জন্য null পাস করুন।
JSON.parse() প্যারামিটার:
JSON.parse() — JSON আউটপুট ব্যবহার করা
একবার আপনার কাছে csvToJson() থেকে একটি JSON স্ট্রিং থাকলে, পরবর্তী ধাপটি সাধারণত এটিকে ফিল্টারিং, ম্যাপিং, বা একটি API-তে পাঠানোর জন্য লাইভ JavaScript অ্যারেতে আবার পার্স করা। একটি JSON স্ট্রিং (typeof === "string") এবং একটি JavaScript অবজেক্টের মধ্যে পার্থক্য গুরুত্বপূর্ণ। আপনি একটি স্ট্রিংয়ে .filter() কল করতে বা [0].name অ্যাক্সেস করতে পারবেন না — আপনার প্রথমে JSON.parse() দরকার। এই রাউন্ড-ট্রিপ (stringify তারপর parse) একটি যাচাইকরণ কৌশল হিসেবেও কাজ করে: যদি আপনার CSV রূপান্তর বৈধ JSON না হয় এমন কিছু তৈরি করে, parse থ্রো করবে। ঐচ্ছিক reviver আর্গুমেন্ট আপনাকে পার্সিংয়ের সময় প্রতিটি key-value জোড়া রূপান্তর করতে দেয় — ISO স্ট্রিং থেকে Date অবজেক্ট পুনরুদ্ধার বা একটি পৃথক পাস ছাড়াই কী নামকরণ করার জন্য উপকারী।
const csv = `endpoint,method,avg_latency_ms,error_rate
/api/v2/orders,POST,342,0.02
/api/v2/health,GET,12,0.00
/api/v2/payments,POST,890,0.15
/api/v2/users,GET,45,0.01`
// ধাপ 1: CSV থেকে JSON স্ট্রিংয়ে রূপান্তর
const jsonString = csvToJson(csv, { coerce: true })
// ধাপ 2: JavaScript অ্যারেতে আবার পার্স করুন
const endpoints = JSON.parse(jsonString)
// এটি একটি অ্যারে কিনা যাচাই করুন
console.log(Array.isArray(endpoints)) // true
// উচ্চ-লেটেন্সি এন্ডপয়েন্ট ফিল্টার করুন
const slow = endpoints.filter(ep => ep.avg_latency_ms > 200)
console.log(slow.map(ep => ep.endpoint))
// ["/api/v2/orders", "/api/v2/payments"]
// প্রথম সারি ডিস্ট্রাকচার করুন
const [first, ...rest] = endpoints
console.log(first.endpoint) // "/api/v2/orders"
console.log(rest.length) // 3ডাউনস্ট্রিম প্রক্রিয়াকরণের আগে রূপান্তর আউটপুট যাচাই করার সময় JSON.parse() এর জন্য একটি নিরাপদ রেপার উপকারী। যদি কোনো কারণে CSV রূপান্তর ত্রুটিপূর্ণ JSON তৈরি করে (কাটা ইনপুট, এনকোডিং ত্রুটি), এটি ক্র্যাশ না করেই ধরে:
function safeParse(jsonString) {
try {
return { data: JSON.parse(jsonString), error: null }
} catch (err) {
return { data: null, error: err.message }
}
}
// বৈধ আউটপুট
const result = safeParse(csvToJson(csv))
if (result.error) {
console.error('CSV রূপান্তর অবৈধ JSON তৈরি করেছে:', result.error)
} else {
console.log(`${result.data.length}টি সারি পার্স হয়েছে`)
}
// কাঁচা CSV সরাসরি JSON.parse-এ পাঠানো — এটি ব্যর্থ হয়
const bad = safeParse('name,email\nরাহুল,rdas@nexuslabs.io')
console.log(bad.error) // "Unexpected token 'a', "name,email"... is not valid JSON"কী নামকরণ এবং যাচাইকরণের জন্য Reviver
reviver ফাংশন পার্সিংয়ের সময় প্রতিটি key-value জোড়া পায়, সবচেয়ে ভেতরের প্রপার্টি থেকে বাইরের দিকে। একটি কীর জন্য undefined রিটার্ন করলে এটি ফলাফল থেকে সম্পূর্ণ সরিয়ে দেয়; একটি ভিন্ন মান রিটার্ন করলে এটি প্রতিস্থাপিত হয়। reviver হেডার নামকরণ (camelCase থেকে snake_case), অভ্যন্তরীণ ফিল্ড ছাঁটাই, বা প্রয়োজনীয় কলাম বিদ্যমান কিনা পরীক্ষা করার জন্য উপকারী। এটি রুট মান দিয়ে শেষে কল হয় (খালি স্ট্রিং কী), যেখানে আপনি এরর থ্রো করেন যদি ফলাফল একটি অ্যারে না হয়।
const jsonString = csvToJson(`employeeId,firstName,hiredDate
EMP-2847,রাহুল,2024-03-15
EMP-3012,প্রিয়া,2023-11-01`, { coerce: false })
const camelToSnake = str => str.replace(/[A-Z]/g, c => '_' + c.toLowerCase())
const employees = JSON.parse(jsonString, function(key, value) {
// রুট মান — আকৃতি যাচাই করুন
if (key === '') {
if (!Array.isArray(value)) throw new Error('CSV থেকে JSON অ্যারে প্রত্যাশিত ছিল')
return value
}
// camelCase হেডার কী snake_case-এ নামকরণ করুন
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
return Object.fromEntries(
Object.entries(value).map(([k, v]) => [camelToSnake(k), v])
)
}
return value
})
console.log(employees[0])
// { employee_id: 'EMP-2847', first_name: 'রাহুল', hired_date: '2024-03-15' }ফাইল এবং API প্রতিক্রিয়া থেকে CSV রূপান্তর
প্রোডাকশনে CSV ডেটা আসলে যে দুটি জায়গা থেকে আসে: ডিস্কে ফাইল এবং HTTP প্রতিক্রিয়া। উভয় পরিস্থিতিতে ত্রুটি পরিচালনা দরকার কারণ ইনপুট বাহ্যিক এবং অনিয়ন্ত্রিত।
CSV ফাইল পড়ুন, রূপান্তর করুন, JSON লিখুন
import { readFileSync, writeFileSync } from 'node:fs'
function csvToJsonFromFile(inputPath, outputPath) {
let csvText
try {
csvText = readFileSync(inputPath, 'utf8')
} catch (err) {
throw new Error(`${inputPath} পড়তে ব্যর্থ: ${err.message}`)
}
const lines = csvText.trim().split('\n')
if (lines.length < 2) {
throw new Error(`${inputPath}-এ কোনো ডেটা সারি নেই (শুধুমাত্র ${lines.length}টি লাইন)`)
}
const headers = lines[0].split(',').map(h => h.trim())
const rows = lines.slice(1)
.filter(line => line.trim() !== '')
.map(line => {
const values = line.split(',')
return Object.fromEntries(headers.map((h, i) => [h, values[i]?.trim()]))
})
const jsonOutput = JSON.stringify(rows, null, 2)
writeFileSync(outputPath, jsonOutput, 'utf8')
console.log(`${rows.length}টি সারি রূপান্তরিত হয়েছে → ${outputPath}`)
return rows
}
// ব্যবহার
const data = csvToJsonFromFile('inventory.csv', 'inventory.json')
console.log(data[0])
// { sku: "WDG-2847", warehouse: "us-east-1", quantity: "150", ... }একটি API এন্ডপয়েন্ট থেকে CSV নিয়ে আসুন
async function fetchCsvAsJson(url) {
const response = await fetch(url)
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`)
}
const contentType = response.headers.get('content-type') || ''
if (!contentType.includes('text/csv') && !contentType.includes('text/plain')) {
console.warn(`অপ্রত্যাশিত content-type: ${contentType}`)
}
const csvText = await response.text()
const lines = csvText.trim().split('\n')
const headers = lines[0].split(',').map(h => h.trim())
const rows = lines.slice(1)
.filter(line => line.trim() !== '')
.map(line => {
const values = line.split(',')
return Object.fromEntries(headers.map((h, i) => [h, values[i]?.trim()]))
})
return rows
}
// উদাহরণ: একটি ডেটা প্রদানকারী থেকে বিনিময় হার CSV নিয়ে আসুন
try {
const rates = await fetchCsvAsJson('https://data.ecb.internal/rates/daily.csv')
console.log(JSON.stringify(rates.slice(0, 3), null, 2))
// ডাউনস্ট্রিম সার্ভিসে JSON হিসেবে পাঠান
await fetch('https://api.internal/v2/rates', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ data: rates }),
})
} catch (err) {
console.error('রেট সিঙ্ক ব্যর্থ হয়েছে:', err.message)
}JSON.stringify()-এর replacer আর্গুমেন্ট আপনাকে CSV থেকে নির্দিষ্ট কলামের হোয়াইটলিস্ট করতে দেয়। শুধুমাত্র সেই ফিল্ডগুলি অন্তর্ভুক্ত করতে হেডার নামের একটি অ্যারে পাস করুন: JSON.stringify(rows, ['name', 'email', 'department'])। অ্যারেতে নেই এমন প্রপার্টিগুলি আউটপুট থেকে নীরবে বাদ দেওয়া হয়।কমান্ড-লাইন CSV থেকে JSON রূপান্তর
Node.js ইনলাইন স্ক্রিপ্ট চালাতে পারে, এবং স্ক্রিপ্ট না লিখেই CSV-থেকে-JSON রূপান্তর পরিচালনা করার জন্য নিবেদিত CLI টুল রয়েছে।
# CSV একটি Node.js ইনলাইন স্ক্রিপ্টে পাইপ করুন
cat servers.csv | node -e "
const lines = require('fs').readFileSync('/dev/stdin','utf8').trim().split('\n');
const h = lines[0].split(',');
const rows = lines.slice(1).map(l => Object.fromEntries(h.map((k,i) => [k.trim(), l.split(',')[i]?.trim()])));
console.log(JSON.stringify(rows, null, 2));
"# Miller কাঠামোগত ডেটার জন্য একটি সুইস আর্মি ছুরি # ইনস্টল: brew install miller (macOS) বা apt install miller (Debian/Ubuntu) mlr --icsv --ojson cat inventory.csv # রূপান্তরের সময় সারি ফিল্টার করুন mlr --icsv --ojson filter '$quantity > 100' inventory.csv # নির্দিষ্ট কলাম নির্বাচন করুন mlr --icsv --ojson cut -f sku,warehouse,quantity inventory.csv
# গ্লোবালি ইনস্টল করুন npm install -g csvtojson # ফাইল রূপান্তর করুন csvtojson servers.csv > servers.json # stdin থেকে পাইপ করুন cat exports/q1-metrics.csv | csvtojson > q1-metrics.json
বড় ফাইলের জন্য, Miller সাধারণত csvtojson-এর চেয়ে ভালো পছন্দ। Miller C-তে বাস্তবায়িত এবং সম্পূর্ণ ফাইল মেমোরিতে লোড না করে CSV স্ট্রিম হিসেবে প্রক্রিয়া করে, যার মানে ধ্রুবক মেমোরি ব্যবহারে মাল্টি-গিগাবাইট এক্সপোর্ট পরিচালনা করে। এটি ইন-প্লেস ফিল্ড-স্তরের অপারেশনও সমর্থন করে — কলাম নামকরণ, মান টাইপ-কাস্টিং, সারি ফিল্টারিং — ডেটা JSON হওয়ার আগেই, তাই আপনি একটি দুই-ধাপের পার্স-তারপর-রূপান্তর পাইপলাইন এড়িয়ে যান। csvtojson, অন্যদিকে, Node.js-এ চলে এবং আরো সুবিধাজনক যখন আপনার বাকি টুলচেইন JavaScript: আপনি এর আউটপুট সরাসরি Node স্ট্রিমে পাইপ করতে পারেন, এটি লাইব্রেরি হিসেবে আমদানি করতে পারেন, বা কোডে প্রতি-কলাম টাইপ জোরপূর্বক রূপান্তরের জন্য এর colParser API ব্যবহার করতে পারেন। কাঁচা থ্রুপুট এবং শেল পাইপলাইনের জন্য Miller পছন্দ করুন; Node.js অ্যাপ্লিকেশনের সাথে ঘনিষ্ঠ একীকরণ দরকার হলে csvtojson পছন্দ করুন।
jq স্থানীয়ভাবে CSV পার্স করে না। যদি পাইপলাইনে jq দরকার হয়, প্রথমে csvtojson বা mlr দিয়ে JSON-এ রূপান্তর করুন, তারপর ফিল্টারিং এবং রূপান্তরের জন্য JSON আউটপুট jq-তে পাইপ করুন।উচ্চ-কার্যক্ষমতার বিকল্প — PapaParse
ম্যানুয়াল split(',') পদ্ধতি বাস্তব-বিশ্বের CSV ফাইলে ব্যর্থ হয়। কমা সহ কোটেড ফিল্ড, এমবেডেড নতুন লাইন, এস্কেপড ডাবল কোটেশন চিহ্ন — এই সবই একটি সাধারণ স্প্লিটার ভেঙে দেয়। PapaParse হল সেই লাইব্রেরি যা আমি ব্যবহার করি যখন CSV একটি অজানা উৎস থেকে আসে। এটি প্রতিটি RFC 4180 এজ কেস পরিচালনা করে, স্বয়ংক্রিয়ভাবে ডিলিমিটার সনাক্ত করে, এবং Node.js এবং উভয় ব্রাউজারে কাজ করে।
npm install papaparse
import Papa from 'papaparse'
const csv = `product,description,price,in_stock
"Widget, Large","A premium widget with ""extra"" features",29.99,true
Bolt Assembly,Standard M8 bolt kit,4.50,true
"Gasket Set","Includes gasket, seal, and O-ring",12.75,false`
const { data, errors, meta } = Papa.parse(csv, {
header: true,
dynamicTyping: true, // স্বয়ংক্রিয়ভাবে সংখ্যা এবং বুলিয়ান রূপান্তর করে
skipEmptyLines: true,
transformHeader: h => h.trim().toLowerCase().replace(/\s+/g, '_'),
})
if (errors.length > 0) {
console.error('পার্স ত্রুটি:', errors)
}
console.log(JSON.stringify(data, null, 2))
// [
// {
// "product": "Widget, Large",
// "description": "A premium widget with \"extra\" features",
// "price": 29.99,
// "in_stock": true
// },
// ...
// ]
console.log(`${data.length}টি সারি পার্স হয়েছে, ডিলিমিটার: "${meta.delimiter}"`)PapaParse-এর dynamicTyping বিকল্প স্বয়ংক্রিয়ভাবে টাইপ জোরপূর্বক রূপান্তর করে — সংখ্যা সংখ্যা হয়, "true"/"false" বুলিয়ান হয়। transformHeader কলব্যাক কলাম নামগুলিকে snake_case-এ সাধারণীকৃত করে, যা আপনাকে বিভিন্ন CSV এক্সপোর্ট থেকে অসামঞ্জস্যপূর্ণ হেডার নিয়ে কাজ করা থেকে বাঁচায়। কোনো পার্সিং কোড না লিখে দ্রুত রূপান্তরের জন্য, CSV থেকে JSON কনভার্টার ব্রাউজারে এই সবকিছু পরিচালনা করে।
সিনট্যাক্স হাইলাইটিং সহ টার্মিনাল আউটপুট
টার্মিনালে একটি বড় JSON অ্যারে ডাম্প করলে দ্রুত চোখ ক্লান্ত হয়ে পড়ে। আউটপুটে সিনট্যাক্স হাইলাইটিং যোগ করলে ডিবাগিং এবং ডেভেলপমেন্টের সময় এটি পাঠযোগ্য হয়। cli-highlight প্যাকেজ Node.js টার্মিনালে JSON আউটপুট রঙিন করে।
npm install cli-highlight
import { highlight } from 'cli-highlight'
// CSV থেকে JSON অ্যারেতে রূপান্তরের পরে
const jsonOutput = JSON.stringify(rows, null, 2)
// সিনট্যাক্স হাইলাইটিং সহ প্রিন্ট করুন
console.log(highlight(jsonOutput, { language: 'json' }))
// কী, স্ট্রিং, সংখ্যা এবং বুলিয়ান প্রতিটি আলাদা রং পায়রঙিন আউটপুট ইন্টারেক্টিভভাবে একটি বড় রূপান্তর ফলাফল পরীক্ষা করার সময় কাজে আসে। JSON কী, স্ট্রিং মান, সংখ্যা এবং বুলিয়ান প্রতিটি আলাদা ANSI রং পায়, যা একটি ফিল্ড খুঁজে পেতে সহজ করে যার টাইপ ভুল — উদাহরণস্বরূপ, একটি পোর্ট নম্বর যা 8080 হওয়া উচিত কিন্তু স্ট্রিং হিসেবে হাইলাইট হয়েছে কারণ জোরপূর্বক রূপান্তর বন্ধ ছিল। স্প্রেডশিট টুল থেকে এক্সপোর্ট করা CSV ফাইল ডিবাগ করার সময় এটি বিশেষভাবে উপকারী যেখানে সারি জুড়ে কলামের টাইপ অসামঞ্জস্যপূর্ণ। রঙ ছাড়া, একটি একক ভুল-টাইপ ফিল্ডের জন্য 50 সারির JSON স্ক্যান করা মানে প্রতিটি মান পৃথকভাবে পড়া। রঙ সহ, একটি স্ট্রিং-রঙের সংখ্যা তাৎক্ষণিক চোখে পড়ে।
বড় CSV ফাইলের সাথে কাজ করা
readFileSync() দিয়ে একটি 500 MB CSV ফাইল স্ট্রিংয়ে লোড করলে মেমোরি খাবে এবং সম্ভবত আপনার প্রক্রিয়া ক্র্যাশ করবে। বড় ফাইলের জন্য, CSV লাইন-বাই-লাইন স্ট্রিম করুন এবং আসার সাথে সাথে JSON অবজেক্ট নির্গত করুন। npm-এ csv ইকোসিস্টেমের অংশ csv-parse প্যাকেজ একটি স্ট্রিমিং পার্সার প্রদান করে যা Node.js স্ট্রিমের সাথে কাজ করে।
csv-parse দিয়ে NDJSON-এ CSV স্ট্রিমিং
NDJSON (Newline-Delimited JSON) একটি ফরম্যাট যেখানে আউটপুট ফাইলের প্রতিটি লাইন একটি স্বয়ং-সম্পূর্ণ JSON অবজেক্ট। একটি একক বড় JSON অ্যারের বিপরীতে — যার পড়া শুরু করার আগে পুরো ফাইল মেমোরিতে থাকা প্রয়োজন — NDJSON ফাইলগুলি লাইন-বাই-লাইন প্রক্রিয়া করা যায়। এটি NDJSON-কে বড় ডেটাসেটের জন্য আদর্শ করে যা লগ প্রসেসর, স্ট্রিম পাইপলাইন, বা বাল্ক-ইমপোর্ট API সহ ডেটাবেস দ্বারা ব্যবহার করা হবে। csv-parse প্যাকেজ অবজেক্ট মোডে প্রতি CSV সারিতে একটি JavaScript অবজেক্ট নির্গত করে, তাই আপনি এটি সরাসরি একটি ট্রান্সফর্ম স্ট্রিমে পাইপ করতে পারেন যা প্রতিটি JSON.stringify(row) এর পরে \n যোগ করে।
import { createReadStream, createWriteStream } from 'node:fs'
import { parse } from 'csv-parse'
import { Transform } from 'node:stream'
import { pipeline } from 'node:stream/promises'
// প্রতিটি CSV সারি অবজেক্টকে একটি JSON লাইনে রূপান্তর করুন
const toNdjson = new Transform({
objectMode: true,
transform(record, encoding, callback) {
callback(null, JSON.stringify(record) + '\n')
},
})
await pipeline(
createReadStream('telemetry-2026-03.csv'),
parse({
columns: true, // প্রথম সারি হেডার হিসেবে ব্যবহার করুন
skip_empty_lines: true,
trim: true,
cast: true, // স্বয়ংক্রিয়ভাবে সংখ্যা এবং বুলিয়ান রূপান্তর করুন
}),
toNdjson,
createWriteStream('telemetry-2026-03.ndjson')
)
console.log('স্ট্রিমিং রূপান্তর সম্পূর্ণ')
// আউটপুট ফাইলের প্রতিটি লাইন একটি JSON অবজেক্ট:
// {"timestamp":"2026-03-15T08:22:00Z","service":"gateway","latency_ms":42,"status":200}
// {"timestamp":"2026-03-15T08:22:01Z","service":"auth","latency_ms":156,"status":401}
// ...ব্রাউজার এবং Node.js-এর জন্য PapaParse স্ট্রিমিং
PapaParse-এর স্ট্রিমিং মোড একটি step কলব্যাক ব্যবহার করে যা সমস্ত সারি মেমোরিতে সংগ্রহ করার পরিবর্তে প্রতি সারিতে একবার ফায়ার করে। আপনি এটিকে একটি Node.js ReadStream (Node.js-এ) বা একটি File অবজেক্ট (ব্রাউজারে) পাস করুন এবং PapaParse অভ্যন্তরীণভাবে চাঙ্কিং পরিচালনা করে। কোনো স্ট্রিম পাইপলাইন সংযুক্ত করার দরকার নেই — শুধু একটি কলব্যাক। csv-parse না টেনে RFC 4180 সম্মতি দরকার হলে ব্যবহার করুন।
import Papa from 'papaparse'
import { createReadStream } from 'node:fs'
let rowCount = 0
const errors = []
const fileStream = createReadStream('warehouse-inventory.csv')
Papa.parse(fileStream, {
header: true,
dynamicTyping: true,
step(result) {
// একবারে একটি সারি প্রক্রিয়া করুন — ধ্রুবক মেমোরি
rowCount++
if (result.data.quantity === 0) {
errors.push(`সারি ${rowCount}: ${result.data.sku} স্টকে নেই`)
}
},
complete() {
console.log(`${rowCount}টি সারি প্রক্রিয়া হয়েছে`)
if (errors.length > 0) {
console.log(`সমস্যা পাওয়া গেছে: ${errors.length}`)
errors.forEach(e => console.log(` ${e}`))
}
},
error(err) {
console.error('পার্স ব্যর্থ হয়েছে:', err.message)
},
})সাধারণ ভুলসমূহ
সমস্যা: CSV হল JSON নয়। একটি কাঁচা CSV স্ট্রিং JSON.parse()-এ পাঠালে SyntaxError থ্রো করে কারণ কমা এবং নতুন লাইন বৈধ JSON সিনট্যাক্স নয়।
সমাধান: প্রথমে split() বা একটি লাইব্রেরি ব্যবহার করে CSV-কে JavaScript অবজেক্টে পার্স করুন, তারপর JSON তৈরি করতে JSON.stringify() ব্যবহার করুন। শুধুমাত্র ইতিমধ্যে বৈধ JSON এমন স্ট্রিংয়ে JSON.parse() কল করুন।
const csv = 'name,email\nরাহুল দাস,rdas@nexuslabs.io' const data = JSON.parse(csv) // SyntaxError: Unexpected token 'a'
const csv = 'name,email\nরাহুল দাস,rdas@nexuslabs.io'
const lines = csv.trim().split('\n')
const headers = lines[0].split(',')
const rows = lines.slice(1).map(line =>
Object.fromEntries(headers.map((h, i) => [h, line.split(',')[i]]))
)
const json = JSON.stringify(rows, null, 2) // বৈধ JSON স্ট্রিংসমস্যা: একটি JavaScript অবজেক্টে toString() কল করলে প্রকৃত ডেটার পরিবর্তে অকার্যকর স্ট্রিং '[object Object]' ফেরত দেয়। এটি নীরবে আপনার CSV-থেকে-JSON আউটপুট নষ্ট করে।
সমাধান: JavaScript অবজেক্ট JSON স্ট্রিংয়ে রূপান্তর করতে সর্বদা JSON.stringify() ব্যবহার করুন। toString() আদিম-থেকে-স্ট্রিং জোরপূর্বক রূপান্তরের জন্য বিদ্যমান, সিরিয়ালাইজেশনের জন্য নয়।
const row = { server: 'api-gateway', port: 8080 }
const output = row.toString()
// "[object Object]" — ডেটা চলে গেছেconst row = { server: 'api-gateway', port: 8080 }
const output = JSON.stringify(row, null, 2)
// '{"server":"api-gateway","port":8080}'সমস্যা: একটি সাধারণ split(",") কোটেড ফিল্ডের ভেতরে কমা থাকলে ভেঙে যায়: "Widget, Large" দুটি পৃথক মানে পরিণত হয় একটির পরিবর্তে।
সমাধান: যেকোনো CSV ডেটার জন্য PapaParse বা csv-parse ব্যবহার করুন যা আপনি সম্পূর্ণভাবে নিয়ন্ত্রণ করেন না। যদি ম্যানুয়ালি পার্স করতে হয়, একটি স্টেট-মেশিন পার্সার প্রয়োগ করুন যা ট্র্যাক করে বর্তমান অবস্থান একটি কোটেড ফিল্ডের ভেতরে কিনা।
const line = '"Widget, Large","Premium quality",29.99'
const values = line.split(',')
// ["\"Widget", " Large\"", "\"Premium quality\"", "29.99"]
// 3-এর পরিবর্তে 4টি মান — প্রথম ফিল্ড ভুলভাবে বিভক্তimport Papa from 'papaparse'
const { data } = Papa.parse('"Widget, Large","Premium quality",29.99')
// data[0] = ["Widget, Large", "Premium quality", "29.99"]
// 3টি মান, সঠিকভাবে পার্স হয়েছেসমস্যা: টাইপ জোরপূর্বক রূপান্তর ছাড়া, port: "8080" JSON-এ সংখ্যার পরিবর্তে স্ট্রিং হিসেবে থাকে। সংখ্যাসূচক টাইপ প্রত্যাশী ডাউনস্ট্রিম সিস্টেম ডেটা প্রত্যাখ্যান বা ভুলভাবে পরিচালনা করে।
সমাধান: ম্যাপিং ধাপে স্পষ্ট টাইপ জোরপূর্বক রূপান্তর প্রয়োগ করুন, অথবা dynamicTyping: true সহ PapaParse ব্যবহার করুন। সর্বদা সচেতন থাকুন কোন ফিল্ডগুলি সংখ্যাসূচক হওয়া উচিত।
const row = { port: '8443', debug: 'true', workers: '4' }
JSON.stringify(row)
// {"port":"8443","debug":"true","workers":"4"} — সব স্ট্রিংconst row = {
port: Number('8443'), // 8443
debug: 'true' === 'true', // true
workers: Number('4'), // 4
}
JSON.stringify(row)
// {"port":8443,"debug":true,"workers":4} — সঠিক টাইপম্যানুয়াল পার্সিং বনাম লাইব্রেরি — দ্রুত তুলনা
দ্রুত স্ক্রিপ্টের জন্য যেখানে আপনি CSV ফরম্যাট নিয়ন্ত্রণ করেন এবং কোনো কোটেড ফিল্ড নেই জানেন, অন্তর্নির্মিত split() + JSON.stringify() পদ্ধতি কাজ করে এবং শূন্য নির্ভরতা প্রয়োজন। ব্যবহারকারী-আপলোড করা CSV ফাইল প্রক্রিয়াকারী প্রোডাকশন সিস্টেমের জন্য, ব্রাউজারে PapaParse বা Node.js-এ csv-parse ব্যবহার করুন — উভয়ই RFC 4180 সঠিকভাবে পরিচালনা করে এবং স্ট্রিমিং সমর্থন করে। csvtojson প্যাকেজই একমাত্র যা সরাসরি JSON আউটপুট করে, একটি একক কলে পার্সিং এবং সিরিয়ালাইজেশন উভয় পরিচালনা করে। পেস্ট-থেকে-ফলাফলের দ্রুততম পথ দরকার হলে, CSV থেকে JSON কনভার্টার কোনো সেটআপ ছাড়াই ব্রাউজারে সবকিছু পরিচালনা করে।
সচরাচর জিজ্ঞাসিত প্রশ্নসমূহ
কোনো লাইব্রেরি ছাড়া JavaScript-এ CSV থেকে JSON কীভাবে রূপান্তর করব?
CSV স্ট্রিংকে নতুন লাইন দিয়ে বিভক্ত করে সারি পান, split(",") দিয়ে প্রথম সারি থেকে হেডার বের করুন, তারপর অবশিষ্ট সারিগুলিকে সেই হেডার দ্বারা কী করা অবজেক্টে ম্যাপ করুন। সবশেষে JSON.stringify(array, null, 2) দিয়ে একটি ফরম্যাটেড JSON স্ট্রিং তৈরি করুন। এই পদ্ধতিটি সহজ CSV ফাইলের জন্য ভালো কাজ করে যেখানে আপনি ফরম্যাট নিয়ন্ত্রণ করেন এবং কোনো কোটেড ফিল্ড বা এমবেডেড কমা নেই। স্প্রেডশিট এক্সপোর্ট বা তৃতীয়-পক্ষের সিস্টেম থেকে ডেটার জন্য, কোটেড ফিল্ড এবং মাল্টি-লাইন মান একটি সাধারণ স্প্লিটার ভেঙে দেবে — সেক্ষেত্রে PapaParse বা csv-parse ব্যবহার করুন। ব্রাউজারে প্রক্রিয়াকৃত খুব ছোট ফাইলের জন্য, এই শূন্য-নির্ভরতার পদ্ধতি আদর্শ।
const csv = `name,email,department
রাহুল দাস,rdas@nexuslabs.io,Engineering
প্রিয়া সেন,psen@nexuslabs.io,Product`
const lines = csv.trim().split('\n')
const headers = lines[0].split(',')
const rows = lines.slice(1).map(line => {
const values = line.split(',')
return Object.fromEntries(headers.map((h, i) => [h.trim(), values[i]?.trim()]))
})
console.log(JSON.stringify(rows, null, 2))
// [
// { "name": "রাহুল দাস", "email": "rdas@nexuslabs.io", "department": "Engineering" },
// { "name": "প্রিয়া সেন", "email": "psen@nexuslabs.io", "department": "Product" }
// ]অবজেক্টের জন্য JSON.stringify() এবং toString()-এর মধ্যে পার্থক্য কী?
একটি সাধারণ অবজেক্টে toString() ব্যবহার করলে অকার্যকর স্ট্রিং "[object Object]" ফেরত দেয় — এটি প্রকৃত ডেটা সম্পর্কে কিছু বলে না। JSON.stringify() সমস্ত কী এবং মান সঠিকভাবে সিরিয়ালাইজড করে একটি বৈধ JSON স্ট্রিং তৈরি করে, যার মধ্যে নেস্টেড অবজেক্ট এবং অ্যারেও রয়েছে। যখনই আপনাকে একটি JavaScript অবজেক্ট (যেমন CSV থেকে তৈরি একটি সারি) JSON স্ট্রিংয়ে রূপান্তর করতে হবে, সর্বদা JSON.stringify() ব্যবহার করুন। অপারেশনটি উল্টাতে — JSON স্ট্রিং থেকে লাইভ JavaScript অবজেক্ট পুনর্গঠন করতে — JSON.parse() ব্যবহার করুন, যা JSON.stringify()-এর সঠিক বিপরীত। এই দুটি ফাংশন একটি সম্পূর্ণ রাউন্ড-ট্রিপ গঠন করে: ডেটা সংরক্ষণ বা প্রেরণ করতে stringify, ব্যবহার করতে parse।
const row = { name: 'রাহুল দাস', role: 'Engineer' }
console.log(row.toString()) // "[object Object]"
console.log(JSON.stringify(row)) // '{"name":"রাহুল দাস","role":"Engineer"}'কমা বা কোটেশন চিহ্ন ধারণকারী CSV ফিল্ড কীভাবে পরিচালনা করব?
RFC 4180 নির্দিষ্ট করে যে কমা, নতুন লাইন, বা ডাবল কোটেশন চিহ্ন ধারণকারী ফিল্ডগুলিকে ডাবল কোটেশন চিহ্নে মুড়তে হবে, এমবেডেড কোটেশন চিহ্ন দ্বিগুণ করে এস্কেপ করতে হবে (কোটেড ফিল্ডের ভেতরে "" একটি একক আক্ষরিক কোটেশন চিহ্ন প্রতিনিধিত্ব করে)। এই ফাইলগুলিতে একটি সাধারণ split(",") ভেঙে যায় — ফিল্ডের সীমানা আর একটি সাধারণ কমা নয়। প্রোডাকশন ডেটার জন্য PapaParse বা csv-parse ব্যবহার করুন, অথবা একটি স্টেট-মেশিন পার্সার লিখুন যা ট্র্যাক করে আপনি একটি কোটেড ফিল্ডের ভেতরে আছেন কিনা। স্ক্র্যাচ থেকে একটি সঠিক স্টেট মেশিন লেখা আশ্চর্যজনকভাবে কঠিন। যেকোনো সামান্য CSV ডেটার বাইরে, একটি ভালো-পরীক্ষিত লাইব্রেরি ব্যবহার করুন।
// PapaParse RFC 4180 সঠিকভাবে পরিচালনা করে
import Papa from 'papaparse'
const csv = `product,description,price
"Widget, Large","A big ""widget""",29.99
Bolt,Standard bolt,1.50`
const { data } = Papa.parse(csv, { header: true })
console.log(JSON.stringify(data, null, 2))
// description ফিল্ড সঠিকভাবে ধারণ করে: A big "widget"ব্রাউজারে সরাসরি CSV থেকে JSON রূপান্তর করা কি সম্ভব?
হ্যাঁ। JSON.stringify() এবং JSON.parse() উভয়ই প্রতিটি ব্রাউজার ইঞ্জিনে অন্তর্নির্মিত। CSV পার্সিং ধাপের জন্য, আপনি সহজ ফাইলের জন্য নতুন লাইন এবং কমা দিয়ে বিভক্ত করতে পারেন, অথবা CDN-এর মাধ্যমে PapaParse অন্তর্ভুক্ত করতে পারেন (এটির কোনো Node.js নির্ভরতা নেই)। সম্পূর্ণ রূপান্তর ক্লায়েন্ট-সাইডে ঘটে, কোনো সার্ভার রাউন্ড-ট্রিপ ছাড়াই, যা ফাইল গোপনীয়তার জন্য উপকারী — কাঁচা CSV ডেটা কখনো ব্যবহারকারীর মেশিন ছেড়ে যায় না। যখন একজন ব্যবহারকারী <input type="file"> উপাদানের মাধ্যমে একটি CSV ফাইল আপলোড করেন, File API-এর file.text() পদ্ধতি একটি Promise রিটার্ন করে যা ফাইলের বিষয়বস্তু স্ট্রিং হিসেবে রিজলভ করে। এটি ব্যাকএন্ড ছাড়াই সম্পূর্ণ ইন-ব্রাউজার CSV-থেকে-JSON রূপান্তরকে ব্যবহারিক করে তোলে।
// ব্রাউজার: ব্যবহারকারী একটি CSV ফাইল আপলোড করে
const fileInput = document.querySelector('input[type="file"]')
fileInput.addEventListener('change', async (event) => {
const file = event.target.files[0]
const text = await file.text()
const lines = text.trim().split('\n')
const headers = lines[0].split(',')
const rows = lines.slice(1).map(line =>
Object.fromEntries(headers.map((h, i) => [h.trim(), line.split(',')[i]?.trim()]))
)
console.log(JSON.stringify(rows, null, 2))
})CSV থেকে সংখ্যাসূচক এবং বুলিয়ান মান কীভাবে পার্স করব, সবকিছু স্ট্রিং হিসেবে না রেখে?
CSV-এর কোনো টাইপ সিস্টেম নেই — প্রতিটি ফিল্ড একটি স্ট্রিং। ম্যাপিং ধাপে মান জোর করে রূপান্তর করতে হবে। সংখ্যাসূচক প্যাটার্নের জন্য Number() বা parseFloat() দিয়ে পরীক্ষা করুন, "true"/"false" বুলিয়ানে রূপান্তর করুন, এবং খালি স্ট্রিং null হিসেবে পরিচালনা করুন। এমন ফিল্ডের ব্যাপারে সতর্ক থাকুন যা সংখ্যার মতো দেখায় কিন্তু স্ট্রিং হিসেবে থাকতে হবে: "07302" এর মতো জিপ কোড Number() দিয়ে রূপান্তরিত হলে তাদের শুরুর শূন্য হারায়। csvtojson লাইব্রেরি তার colParser বিকল্পের মাধ্যমে স্বয়ংক্রিয় টাইপ জোরপূর্বক রূপান্তর করে। PapaParse-এর dynamicTyping বিকল্প সমস্ত কলামে একই জোরপূর্বক রূপান্তর প্রয়োগ করে।
function coerceValue(val) {
if (val === '') return null
if (val === 'true') return true
if (val === 'false') return false
const num = Number(val)
if (!isNaN(num) && val.trim() !== '') return num
return val
}
// CSV-থেকে-অবজেক্ট ম্যাপিংয়ের সময় প্রয়োগ করুন
const row = { port: coerceValue('8443'), debug: coerceValue('true'), host: coerceValue('api.internal') }
// { port: 8443, debug: true, host: "api.internal" }Node.js-এ CSV-থেকে-JSON আউটপুট একটি ফাইলে কীভাবে লিখব?
JSON.stringify() আউটপুট সহ fs.writeFileSync() ব্যবহার করুন। JSON.stringify-এর তৃতীয় আর্গুমেন্ট ইন্ডেন্টেশন নিয়ন্ত্রণ করে — দুই-স্পেস ইন্ডেন্টের জন্য 2 বা ট্যাবের জন্য "\t" পাস করুন। ফাইলটি আবার পড়তে, JSON.parse(fs.readFileSync(path, "utf8")) ব্যবহার করুন, যা লাইভ JavaScript অ্যারে পুনর্গঠন করে। যদি আপনি একটি async প্রেক্ষাপটে ফাইল লিখছেন, ইভেন্ট লুপ ব্লক করা এড়াতে fs.promises.writeFile() পছন্দ করুন। কয়েক মেগাবাইটের বেশি বড় JSON আউটপুটের জন্য, লেখার আগে মেমোরিতে পুরো স্ট্রিং তৈরির পরিবর্তে WriteStream-এ একটি JSON স্ট্রিম পাইপ করার কথা বিবেচনা করুন।
import { writeFileSync, readFileSync } from 'node:fs'
// লিখুন
const jsonOutput = JSON.stringify(rows, null, 2)
writeFileSync('employees.json', jsonOutput, 'utf8')
// আবার পড়ুন
const parsed = JSON.parse(readFileSync('employees.json', 'utf8'))
console.log(Array.isArray(parsed)) // true
console.log(parsed[0].name) // "রাহুল দাস"সম্পর্কিত টুলসমূহ
Alex is a front-end and Node.js developer with extensive experience building web applications and developer tooling. He is passionate about web standards, browser APIs, and the JavaScript ecosystem. In his spare time he contributes to open-source projects and writes about modern JavaScript patterns, performance optimisation, and everything related to the web platform.
Sophie is a full-stack developer focused on TypeScript across the entire stack — from React frontends to Express and Fastify backends. She has a particular interest in type-safe API design, runtime validation, and the patterns that make large JavaScript codebases stay manageable. She writes about TypeScript idioms, Node.js internals, and the ever-evolving JavaScript module ecosystem.