C# (.NET) में CSV के साथ कार्य: उपकरणों का अवलोकन और उदाहरण
CSV (Comma-Separated Values) — सारणीबद्ध डेटा के आदान-प्रदान के लिए सबसे सामान्य प्रारूपों में से एक है। C# (.NET) इकोसिस्टम में इस प्रारूप के साथ काम करने के कई विश्वसनीय तरीके मौजूद हैं: अंतर्निहित टूल से लेकर शक्तिशाली तृतीय-पक्ष लाइब्रेरीज़ तक। इस लेख में हम मुख्य दृष्टिकोणों और सर्वोत्तम प्रथाओं पर विचार करेंगे।
CSV पार्सर स्वयं क्यों नहीं लिखना चाहिए?
CSV प्रारूप पहली नज़र में सरल लगता है, लेकिन व्यवहार में इसमें कई बारीकियाँ हैं: उद्धरण चिह्नों का एस्केपिंग, फ़ील्ड के अंदर अल्पविराम, अलग-अलग विभाजक, मानों में नई पंक्ति के वर्ण। तैयार लाइब्रेरीज़ का उपयोग करने से सिरदर्द और किनारे के मामलों की प्रक्रिया से बचा जाता है।
CsvHelper लाइब्रेरी — स्वर्ण मानक
CsvHelper — .NET में CSV के साथ काम करने के लिए सबसे लोकप्रिय लाइब्रेरी है। यह POCO-क्लास पर मैपिंग, स्ट्रीमिंग रीडिंग, विभाजक और एन्कोडिंग के कॉन्फ़िगरेशन का समर्थन करती है।
NuGet के माध्यम से स्थापना:
Install-Package CsvHelperऑब्जेक्ट्स की सूची में CSV पढ़ने का उदाहरण
using CsvHelper;using System.Globalization;
public class User{ public int Id { get; set; } public string Name { get; set; } public string Email { get; set; }}
var users = new List<User>();using (var reader = new StreamReader("users.csv"))using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)){ users = csv.GetRecords<User>().ToList();}संग्रह से CSV लिखने का उदाहरण
using (var writer = new StreamWriter("output.csv"))using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)){ csv.WriteRecords(users);}अंतर्निहित पार्सर: TextFieldParser (Microsoft.VisualBasic)
यदि आप बाहरी निर्भरताएँ शामिल नहीं करना चाहते हैं, तो .NET में Microsoft.VisualBasic.FileIO नाम स्थान से अंतर्निहित TextFieldParser है। यह .NET Framework और .NET Core/.NET 5+ में उपलब्ध है (पैकेज Microsoft.VisualBasic की स्थापना आवश्यक है)।
TextFieldParser के उपयोग का उदाहरण
using Microsoft.VisualBasic.FileIO;
using (var parser = new TextFieldParser("data.csv")){ parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); parser.HasFieldsEnclosedInQuotes = true;
while (!parser.EndOfData) { string[] fields = parser.ReadFields(); Console.WriteLine(string.Join(" | ", fields)); }}लाभ: तृतीय-पक्ष लाइब्रेरीज़ की आवश्यकता नहीं है। नुकसान: CsvHelper की तुलना में कम लचीला, क्लास पर स्वचालित मैपिंग नहीं है।
बड़ी फ़ाइलों के साथ कार्य: स्ट्रीमिंग प्रोसेसिंग
100 MB से अधिक आकार की CSV फ़ाइलों के साथ काम करते समय, पूरी फ़ाइल को मेमोरी में लोड करने से बचना महत्वपूर्ण है। दोनों लाइब्रेरीज़ स्ट्रीमिंग प्रोसेसिंग का समर्थन करती हैं:
- CsvHelper —
.ToList()को कॉल किए बिनाforeachलूप मेंGetRecords<T>()का उपयोग करें। - TextFieldParser — पंक्ति दर पंक्ति पढ़ता है, जो भी कुशल है।
CsvHelper के साथ स्ट्रीमिंग रीडिंग का उदाहरण
using (var reader = new StreamReader("large.csv"))using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)){ foreach (var record in csv.GetRecords<User>()) { ProcessUser(record); // एक-एक करके प्रोसेस करें }}त्रुटि प्रबंधन और डेटा सत्यापन
CSV आयात करते समय डेटा गलत हो सकता है। CsvHelper इवेंट के माध्यम से त्रुटि प्रबंधन को कॉन्फ़िगर करने की अनुमति देता है:
csv.Configuration.BadDataFound = context =>{ Console.WriteLine($"पंक्ति {context.RawRow} में त्रुटि: {context.RawRecord}");};फ़ील्ड सत्यापन के लिए एट्रिब्यूट का भी उपयोग किया जा सकता है:
public class Product{ [Name("ProductId")] public int Id { get; set; } [Required] public string Nam