C++ में CSV के साथ कार्य: लाइब्रेरीज़ और व्यावहारिक उदाहरण
\n\nCSV (Comma-Separated Values) सारणीबद्ध डेटा भंडारण के लिए सबसे सामान्य प्रारूपों में से एक है। C++ में मानक लाइब्रेरी (C++23 तक) में CSV के लिए अंतर्निहित समर्थन नहीं है, इसलिए डेवलपर्स तृतीय-पक्ष लाइब्रेरीज़ का उपयोग करते हैं या अपने स्वयं के पार्सर लिखते हैं। इस लेख में, हम C++ में CSV के साथ कार्य करने के मुख्य दृष्टिकोणों का विश्लेषण करेंगे: मैन्युअल पार्सिंग से लेकर तैयार समाधानों तक।
\n\nCSV के लिए लाइब्रेरीज़ की आवश्यकता क्यों है?
\nCSV फ़ाइलें सरल लगती हैं, लेकिन व्यवहार में इनमें कई छिपी समस्याएँ होती हैं:
\n- \n
- फ़ील्ड के अंदर उद्धरण चिह्नों का एस्केपिंग (उदाहरण:
"Hello, world") \n - बहु-पंक्ति मान \n
- विभिन्न विभाजक (अल्पविराम, अर्धविराम, टैब) \n
- विभिन्न एन्कोडिंग (UTF-8, UTF-16, ANSI) \n
तैयार लाइब्रेरीज़ इन समस्याओं का समाधान करती हैं और समय बचाती हैं।
\n\n1. मैन्युअल CSV पार्सिंग (तृतीय-पक्ष लाइब्रेरीज़ के बिना)
\nसरल मामलों के लिए, आप स्वयं पार्सर लिख सकते हैं। std::ifstream और std::getline का उपयोग करके CSV पढ़ने का उदाहरण:
#include <iostream>\n#include <fstream>\n#include <sstream>\n#include <vector>\n#include <string>\n\nstd::vector<std::vector<std::string>> parseCSV(const std::string& filename) {\n std::vector<std::vector<std::string>> data;\n std::ifstream file(filename);\n std::string line;\n\n while (std::getline(file, line)) {\n std::vector<std::string> row;\n std::stringstream ss(line);\n std::string cell;\n\n while (std::getline(ss, cell, ',')) {\n // अतिरिक्त उद्धरण हटाएँ (सरलीकृत)\n if (cell.size() >= 2 && cell.front() == '"' && cell.back() == '"') {\n cell = cell.substr(1, cell.size() - 2);\n }\n row.push_back(cell);\n }\n data.push_back(row);\n }\n return data;\n}\n\nकमियाँ: उद्धरणों के अंदर एस्केप किए गए अल्पविराम, बहु-पंक्ति फ़ील्ड, फ़ाइल के अंत में खाली पंक्तियों को संसाधित नहीं करता।
\n\n2. libcsv लाइब्रेरी (C)
\nlibcsv C में एक हल्की लाइब्रेरी है जो RFC 4180 के अनुसार CSV को सही ढंग से पार्स करती है। उन परियोजनाओं के लिए उपयुक्त जहाँ प्रदर्शन महत्वपूर्ण है।
स्थापना (Linux): sudo apt-get install libcsv-dev
#include <csv.h>\n#include <iostream>\n#include <vector>\n\nvoid cb1(void *s, size_t len, void *data) {\n std::string field(static_cast<char*>(s), len);\n static_cast<std::vector<std::string>*>(data)->push_back(field);\n}\n\nvoid cb2(int c, void *data) {\n if (c == CsvRowEnd) {\n // पंक्ति का अंत — प्रदर्शित करें\n auto& row = *static_cast<std::vector<std::string>*>(data);\n for (const auto& f : row) std::cout << f << " | ";\n std::cout << "\\n";\n row.clear();\n }\n}\n\nint main() {\n FILE *fp = fopen("data.csv", "r");\n if (!fp) return 1;\n\n struct csv_parser p;\n csv_init(&p, CSV_STRICT);\n\n std::vector<std::string> row;\n char buf[1024];\n size_t bytes_read;\n\n while ((bytes_read = fread(buf, 1, sizeof(buf), fp)) > 0) {\n csv_parse(&p, buf, bytes_read, cb1, cb2, &row);\n }\n csv_fini(&p, cb1, cb2, &row);\n csv_free(&p);\n fclose(fp);\n return 0;\n}\n\n3. rapidcsv लाइब्रेरी (C++ header-only)
\nrapidcsv एक आधुनिक C++17 लाइब्रेरी है जो केवल हेडर फ़ाइलों के साथ काम करती है। यह स्वचालित विभाजक पहचान, विभिन्न डेटा प्रकारों के साथ कार्य और CSV लेखन का समर्थन करती है।
स्थापना: rapidcsv.h को प्रोजेक्ट में कॉपी करें।
#include "rapidcsv.h"\n#include <iostream>\n#include <vector>\n\nint main() {\n // CSV पढ़ना\n rapidcsv::Docum