C++ में CSV के साथ कार्य: libcsv लाइब्रेरी और मानक उपकरण

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C++ में CSV के साथ कार्य: मैन्युअल पार्सिंग से libcsv लाइब्रेरी तक



CSV (Comma-Separated Values) प्रारूप सारणीबद्ध डेटा के आदान-प्रदान के सबसे लोकप्रिय तरीकों में से एक बना हुआ है। C++ में CSV के लिए कोई अंतर्निहित समर्थन नहीं है, लेकिन कई प्रभावी दृष्टिकोण मौजूद हैं: मानक उपकरणों का उपयोग करके मैन्युअल पार्सिंग और libcsv जैसी विशेष लाइब्रेरी। इस लेख में, हम दोनों विधियों, उनके फायदे और नुकसान पर चर्चा करेंगे, और काम करने वाले कोड उदाहरण प्रस्तुत करेंगे।



CSV क्या है और इसकी विशेषताएं



CSV एक टेक्स्ट प्रारूप है, जहाँ प्रत्येक पंक्ति एक रिकॉर्ड से मेल खाती है, और फ़ील्ड को अल्पविराम से अलग किया जाता है। मुख्य जटिलताएँ:

  • फ़ील्ड में अल्पविराम हो सकते हैं यदि वे उद्धरण चिह्नों में संलग्न हों ("Hello, world");
  • फ़ील्ड के अंदर उद्धरण चिह्नों को दोहराकर एस्केप किया जाता है ("");
  • विभाजक कोई अन्य वर्ण हो सकता है (अर्धविराम, टैब);
  • पंक्तियों में उद्धरण चिह्नों के अंदर न्यूलाइन वर्ण हो सकते हैं।


इसलिए, स्ट्रिंग को केवल अल्पविराम से विभाजित करने से अक्सर त्रुटियाँ होती हैं। आइए दो विश्वसनीय तरीकों पर विचार करें।



विधि 1: std::stringstream का उपयोग करके मैन्युअल पार्सिंग



नेस्टेड उद्धरण चिह्नों और लाइन ब्रेक के बिना सरल CSV के लिए उपयुक्त। कार्यान्वयन में दो फ़ंक्शन शामिल हैं: एक फ़ील्ड पढ़ना और पूरी पंक्ति को पार्स करना।



#include <iostream>#include <fstream>#include <sstream>#include <vector>#include <string>

// उद्धरण चिह्नों को ध्यान में रखते हुए CSV पंक्ति को फ़ील्ड में विभाजित करनाstd::vector<std::string> parseCSVLine(const std::string& line) { std::vector<std::string> fields; std::string field; bool inQuotes = false;

for (size_t i = 0; i < line.size(); ++i) { char c = line[i]; if (c == '"' && !inQuotes) { inQuotes = true; } else if (c == '"' && inQuotes) { // एस्केप किए गए उद्धरण चिह्नों की जाँच if (i + 1 < line.size() && line[i + 1] == '"') { field += '"'; ++i; // अगला उद्धरण चिह्न छोड़ें } else { inQuotes = false; } } else if (c == ',' && !inQuotes) { fields.push_back(field); field.clear(); } else { field += c; } } fields.push_back(field); // अंतिम फ़ील्ड return fields;}

int main() { std::ifstream file("data.csv"); std::string line;

while (std::getline(file, line)) { auto fields = parseCSVLine(line); for (const auto& f : fields) { std::cout << "[" << f << "] "; } std::cout << std::endl; } return 0;}


लाभ: कोई बाहरी निर्भरता नहीं, तर्क पर पूर्ण नियंत्रण।
नुकसान: बहु-पंक्ति फ़ील्ड (मान जिसमें हो) को संभालता नहीं है, मैन्युअल त्रुटि प्रबंधन की आवश्यकता है।



विधि 2: libcsv लाइब्रेरी



libcsv CSV पार्सिंग के लिए एक हल्की C-लाइब्रेरी है, जो C में लिखी गई है, लेकिन C++ से बढ़िया काम करती है। यह सभी मानक मामलों को सही ढंग से संभालती है: उद्धरण चिह्न, एस्केपिंग, बहु-पंक्ति फ़ील्ड, कस्टम विभाजक।



स्थापना

SourceForge से स्रोत डाउनलोड करें या पैकेज मैनेजर के माध्यम से स्थापित करें:

# Linux (Debian/Ubuntu)sudo apt-get install libcsv-dev

# macOSbrew install libcsv


libcsv के साथ CSV पढ़ने का उदाहरण



#include <iostream>#include <fstream>#include <vector>#include <string>#include <cstring>#include <csv.h>

// डेटा संग्रहीत करने के लिए संरचनाstruct CSVData { std::vector<std::vector<std::string>> rows; std::vector<std::string> currentRow;};

// Ca

अनुशंसाएँ