Rust में CSV के साथ काम करना: csv लाइब्रेरी और व्यावहारिक उदाहरण
\n\nCSV (Comma-Separated Values) प्रारूप सारणीबद्ध डेटा को संग्रहीत करने के सबसे लोकप्रिय तरीकों में से एक बना हुआ है। Rust में CSV के साथ काम करने के लिए एक परिपक्व और उच्च-प्रदर्शन वाली लाइब्रेरी csv मौजूद है, जो डेटा पढ़ने, लिखने और प्रोसेस करने के लिए एक सुविधाजनक API प्रदान करती है। इस लेख में, हम विस्तार से जानेंगे कि Rust में CSV के साथ कुशलतापूर्वक कैसे काम किया जाए।
लाइब्रेरी की स्थापना और कनेक्शन
\n\nशुरू करने के लिए, Cargo.toml फ़ाइल में निर्भरता जोड़ें:
[dependencies]\ncsv = "1.3"\n\ncsv लाइब्रेरी एन्कोडिंग, कस्टमाइज़ेबल डिलीमीटर और कोट्स के साथ काम करने का समर्थन करती है, साथ ही serde ट्रेट्स के माध्यम से डेटा के सीरियलाइज़ेशन/डीसीरियलाइज़ेशन की सुविधा भी प्रदान करती है।
CSV फ़ाइल पढ़ना
\n\nCSV पढ़ने का सबसे आसान तरीका csv::Reader का उपयोग करना है। users.csv फ़ाइल के साथ एक उदाहरण देखें:
use std::error::Error;\nuse csv::ReaderBuilder;\n\nfn main() -> Result<(), Box<dyn Error>> {\n // सेटिंग्स के साथ एक रीडर बनाएँ\n let mut rdr = ReaderBuilder::new()\n .has_headers(true) // पहली पंक्ति हेडर है\n .delimiter(b',') // डिलीमीटर कॉमा है\n .from_path("users.csv")?;\n\n // हेडर प्रिंट करें\n let headers = rdr.headers()?;\n println!("Headers: {:?}", headers);\n\n // रिकॉर्ड पर इटरेट करें\n for result in rdr.records() {\n let record = result?;\n println!("{:?}", record);\n }\n Ok(())\n}\n\nडीसीरियलाइज़ेशन के साथ रिकॉर्ड प्रोसेस करना
\n\nस्ट्रक्चर्ड डेटा के साथ काम करने के लिए, यूज़र-डिफ़ाइंड स्ट्रक्चर में डीसीरियलाइज़ेशन का उपयोग करना सुविधाजनक है। serde और serde_derive को कनेक्ट करें:
[dependencies]\ncsv = "1.3"\nserde = { version = "1.0", features = ["derive"] }\n\nअब आप एक स्ट्रक्चर परिभाषित कर सकते हैं और सीधे डेटा पढ़ सकते हैं:
\n\nuse serde::Deserialize;\n\n#[derive(Debug, Deserialize)]\nstruct User {\n name: String,\n age: u8,\n email: String,\n}\n\nfn main() -> Result<(), Box<dyn std::error::Error>> {\n let mut rdr = csv::Reader::from_path("users.csv")?;\n\n for result in rdr.deserialize() {\n let user: User = result?;\n println!("उपयोगकर्ता: {} ({} वर्ष) - {}", user.name, user.age, user.email);\n }\n Ok(())\n}\n\nCSV में डेटा लिखना
\n\nलिखने के लिए csv::Writer का उपयोग किया जाता है। स्ट्रक्चर्ड डेटा लिखने का उदाहरण:
use csv::Writer;\nuse serde::Serialize;\n\n#[derive(Debug, Serialize)]\nstruct Product {\n id: u32,\n name: String,\n price: f64,\n in_stock: bool,\n}\n\nfn main() -> Result<(), Box<dyn std::error::Error>> {\n let mut wtr = Writer::from_path("products.csv")?;\n\n // हेडर लिखें\n wtr.write_record(&["id", "name", "price", "in_stock"])?;\n\n // सीरियलाइज़ेशन के माध्यम से डेटा लिखें\n let products = vec![\n Product { id: 1, name: "लैपटॉप".into(), price: 75000.50, in_stock: true },\n Product { id: 2, name: "माउस".into(), price: 1500.00, in_stock: false },\n ];\n\n for product in &products {\n wtr.serialize(product)?;\n }\n\n wtr.flush()?;\n println!("डेटा products.csv में लिखा गया");\n Ok(())\n}\n\nडिलीमीटर और कोट्स का कॉन्फ़िगरेशन
\n\nलाइब्रेरी फ़ॉर्मेट को लचीले ढंग से कॉन्फ़िगर करने की अनुमति देती है। उदाहरण के लिए, TSV (टैब डिलीमीटर) के लिए:
\n\nlet mut rdr = csv::ReaderBuilder::new()\n .delimiter(b'\\t')\n .flexible(true) // अलग-अलग संख्या में फ़ील्ड की अनुमति दें\n .quoting(false) // कोट्स बंद करें\n .from_reader(io::stdin());\n\nत्रुटियों और बड़ी फ़ाइलों का प्रबंधन
\n\nबड़ी CSV फ़ाइलों के साथ काम करते समय प्रदर्शन पर ध्यान देना महत्वपूर्ण है। csv बफ़र्ड रीडिंग का उपयोग करता है और सभी डेटा को मेमोरी में लोड नहीं करता