मूल वर्ग में एक समस्या है, और यदि आप एक नया कॉलम जोड़ना चाहते हैं, तो आपको निर्यात विधि पर KeyNotFoundException प्राप्त होगी। उदाहरण के लिए:
static void Main(string[] args)
{
var export = new CsvExport();
export.AddRow();
export["Region"] = "New York, USA";
export["Sales"] = 100000;
export["Date Opened"] = new DateTime(2003, 12, 31);
export.AddRow();
export["Region"] = "Sydney \"in\" Australia";
export["Sales"] = 50000;
export["Date Opened"] = new DateTime(2005, 1, 1, 9, 30, 0);
export["Balance"] = 3.45f; //Exception is throwed for this new column
export.ExportToFile("Somefile.csv");
}
इसे हल करने के लिए, और प्रतिबिंब का उपयोग करने के @KeyboardCowboy विचार का उपयोग करते हुए, मैंने उन पंक्तियों को जोड़ने की अनुमति देने के लिए कोड को संशोधित किया जिनके पास समान कॉलम नहीं हैं। आप अनाम कक्षाओं के उदाहरणों का उपयोग कर सकते हैं। उदाहरण के लिए:
static void Main(string[] args)
{
var export = new CsvExporter();
export.AddRow(new {A = 12, B = "Empty"});
export.AddRow(new {A = 34.5f, D = false});
export.ExportToFile("File.csv");
}
आप स्रोत कोड यहाँ CsvExporter डाउनलोड कर सकते हैं । बेझिझक उपयोग करें और संशोधित करें।
अब, यदि आप जो पंक्तियाँ लिखना चाहते हैं, वे सभी एक ही वर्ग की हैं, तो मैंने सामान्य वर्ग CsvWriter.cs बनाया , जिसमें बेहतर प्रदर्शन RAM उपयोग और बड़ी फ़ाइलों को लिखने के लिए आदर्श है। निष्कर्ष यह है कि आप डेटा प्रकारों में फ़ॉर्मेटर्स जोड़ना चाहते हैं । उपयोग का एक उदाहरण:
class Program
{
static void Main(string[] args)
{
var writer = new CsvWriter<Person>("Persons.csv");
writer.AddFormatter<DateTime>(d => d.ToString("MM/dd/yyyy"));
writer.WriteHeaders();
writer.WriteRows(GetPersons());
writer.Flush();
writer.Close();
}
private static IEnumerable<Person> GetPersons()
{
yield return new Person
{
FirstName = "Jhon",
LastName = "Doe",
Sex = 'M'
};
yield return new Person
{
FirstName = "Jhane",
LastName = "Doe",
Sex = 'F',
BirthDate = DateTime.Now
};
}
}
class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public char Sex { get; set; }
public DateTime BirthDate { get; set; }
}