क्यों मैं 'System.IO.StreamWriter' से 'CsvHelper.ISerializer' में नहीं बदल सकता?


9

लोगों की सामग्री को एक CSVfile में लिखने की कोशिश करना और फिर उसे निर्यात करना, हालाँकि मुझे बिल्ड एरर और इसकी विफलता मिल रही है। त्रुटि यह है:

cannot convert from 'System.IO.StreamWriter' to 'CsvHelper.ISerializer'

मुझे यकीन नहीं है कि ऐसा क्यों हो रहा है जब तक कि मैं निश्चित नहीं हूं, मैंने इसे इस तरह से लोड किया है।

private void ExportAsCSV()
{
    using (var memoryStream = new MemoryStream())
    {
        using (var writer = new StreamWriter(memoryStream))
        {
            using (var csv = new CsvHelper.CsvWriter(writer))
            {
                csv.WriteRecords(people);
            }

            var arr = memoryStream.ToArray();
            js.SaveAs("people.csv",arr);
        }
    }
}

क्या आप स्पष्ट कर सकते हैं तुम क्यों लगता है कि तुम चाहिए से कन्वर्ट करने के लिए सक्षम होने के StreamWriterलिए ISerializer? StreamWriter.NET का ही हिस्सा है - यह एक विशिष्ट तृतीय पक्ष पैकेज से इंटरफेस को लागू नहीं कर सकता है।
जॉन स्कीट

1
यह सुझाव CsvHelper.CsvWriter(TextWriter)दायरे में नहीं है। दोहरा चेक करें कि आपको पैकेज का सही संस्करण मिल रहा है, और यह StreamWriterसामान्य वर्ग ( System.IO.StreamWriter) है। CsvWriterडबल-चेक करने के लिए "परिभाषा पर जाएं" का उपयोग करें।
जीरो मोस्टर्ट

@JeroenMostert का मतलब क्या आप csvWriter को चेक कर सकते हैं? मैंने किया और इसका संबंध CSVhelper वर्ग से है जो CsvHelper.Configuration का उपयोग करता है; CsvHelper.TypeConversion का उपयोग करना; सिस्टम का उपयोग; System.Collections का उपयोग कर; System.Collections.Generic का उपयोग कर; System.Dynamic का उपयोग करना; System.Globalization का उपयोग करना; System.IO का उपयोग कर; System.Threading.Tasks का उपयोग कर;
एंडी स्टाव

हां, लेकिन जो कंपाइलर आपको बता रहा है वह यह है कि यह CsvWriterकंस्ट्रक्टर को इनवाइट कर रहा है जो कि ISerializerकन्वर्जन करता है , और फेल होने के बाद से इसका कोई रूपांतरण नहीं है। इसे उस CsvWriterकंस्ट्रक्टर को चुनना चाहिए था, जो उस TextWriterसे StreamWriterविरासत में मिला है, इसलिए या तो वह कंस्ट्रक्टर गायब है (जो भी कारण हो) या कम्पाइलर का अधिभार संकल्प टूट गया है (थोड़ा कम संभावित, लेकिन अजीब चीजें हुई हैं)।
जीरो मोस्टर्ट

जवाबों:


32

13.0.0 संस्करण के साथ एक ब्रेकिंग परिवर्तन था। स्थानीयकरण के साथ कई मुद्दे रहे हैं, इसलिए @JoshClose उपयोगकर्ताओं को यह निर्दिष्ट करने की आवश्यकता है कि CultureInfoवे उपयोग करना चाहते हैं। अब आपको CultureInfoबनाते समय CsvReaderऔर शामिल करने की आवश्यकता है CsvWriterhttps://github.com/JoshClose/CsvHelper/issues/1441

private void ExportAsCSV()
{
    using (var memoryStream = new MemoryStream())
    {
        using (var writer = new StreamWriter(memoryStream))
        {
            using (var csv = new CsvHelper.CsvWriter(writer, System.Globalization.CultureInfo.CurrentCulture)
            {
                csv.WriteRecords(people);
            }

            var arr = memoryStream.ToArray();
            js.SaveAs("people.csv",arr);
        }
    }
}

नोट: CultureInfo.CurrentCulture पिछले संस्करणों में डिफ़ॉल्ट था।

विचार करें

  • CultureInfo.InvariantCulture- यदि आप फाइल के लिखने और पढ़ने दोनों को नियंत्रित करते हैं। इस तरह यह काम करेगा कोई फर्क नहीं पड़ता कि उपयोगकर्ता को अपने कंप्यूटर पर क्या संस्कृति है।
  • CultureInfo.CreateSpecificCulture("en-US")- यदि आपको उपयोगकर्ता की संस्कृति से स्वतंत्र किसी विशेष संस्कृति के लिए काम करने की आवश्यकता है ।

आपने मुझे बहुत समय बचाया, धन्यवाद, डेविड * v15.0.0 के लिए काम करता है
कोंस्टेंटिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.