सीएसवी के लिए सी # datatable


113

क्या कोई मुझे बता सकता है कि निम्नलिखित कोड काम क्यों नहीं कर रहा है। डेटा को csv फ़ाइल में सहेजा जाता है, हालाँकि डेटा को अलग नहीं किया जाता है। यह सभी प्रत्येक पंक्ति के पहले सेल के भीतर मौजूद है।

StringBuilder sb = new StringBuilder();

foreach (DataColumn col in dt.Columns)
{
    sb.Append(col.ColumnName + ',');
}

sb.Remove(sb.Length - 1, 1);
sb.Append(Environment.NewLine);

foreach (DataRow row in dt.Rows)
{
    for (int i = 0; i < dt.Columns.Count; i++)
    {
        sb.Append(row[i].ToString() + ",");
    }

    sb.Append(Environment.NewLine);
}

File.WriteAllText("test.csv", sb.ToString());

धन्यवाद।


आप इस जाँच कर सकते हैं gist.github.com/riyadparvez/4467668
उपयोगकर्ता

मैंने उच्च प्रदर्शन विस्तार का विकास किया। इस उत्तर की
निगजे

जवाबों:


229

निम्न छोटा संस्करण Excel में ठीक खुलता है, हो सकता है कि आपका मुद्दा अनुगामी अल्पविराम था

.net = 3.5

StringBuilder sb = new StringBuilder(); 

string[] columnNames = dt.Columns.Cast<DataColumn>().
                                  Select(column => column.ColumnName).
                                  ToArray();
sb.AppendLine(string.Join(",", columnNames));

foreach (DataRow row in dt.Rows)
{
    string[] fields = row.ItemArray.Select(field => field.ToString()).
                                    ToArray();
    sb.AppendLine(string.Join(",", fields));
}

File.WriteAllText("test.csv", sb.ToString());

.net> = 4.0

और जैसा कि टिम ने बताया, यदि आप .net> = 4 पर हैं, तो आप इसे और भी छोटा कर सकते हैं:

StringBuilder sb = new StringBuilder(); 

IEnumerable<string> columnNames = dt.Columns.Cast<DataColumn>().
                                  Select(column => column.ColumnName);
sb.AppendLine(string.Join(",", columnNames));

foreach (DataRow row in dt.Rows)
{
    IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString());
    sb.AppendLine(string.Join(",", fields));
}

File.WriteAllText("test.csv", sb.ToString());

जैसा कि ईसाई द्वारा सुझाया गया है, यदि आप खेतों में भागने वाले विशेष पात्रों को संभालना चाहते हैं, तो लूप ब्लॉक को इसके द्वारा प्रतिस्थापित करें:

foreach (DataRow row in dt.Rows)
{
    IEnumerable<string> fields = row.ItemArray.Select(field => 
      string.Concat("\"", field.ToString().Replace("\"", "\"\""), "\""));
    sb.AppendLine(string.Join(",", fields));
}

और अंतिम सुझाव, आप एक बड़े दस्तावेज़ को स्मृति में एक बड़ा दस्तावेज़ होने से बचने के लिए लाइन द्वारा सीएसवी सामग्री लाइन लिख सकते हैं।


2
किसी ItemArrayनए की प्रतिलिपि बनाने की आवश्यकता नहीं है String[], आप .ToArray().NET 4 के साथ छोड़ सकते हैं और String.Joinअधिभार का उपयोग कर सकते हैं जो एक IEnumerable<T>(संपादित) लेता है ।
टिम शाल्टर

2
@TimSchmelter, हाँ लेकिन इन भार के .net4 में पेश किए गए, अगर ओपी .net <4 का उपयोग करता है कोड संकलन नहीं होगा
vc 74

18
यह विधि किसी स्तंभ मान के अंदर अल्पविराम को ध्यान में नहीं रखती है।
क्रिश्चियन

2
इसके बजाय IEnumerable <string> फ़ील्ड्स = row.ItemArray.Select (फ़ील्ड => field.Toring ()। प्रतिस्थापित करें ("\" "," \ "\" "); sb.AppendLine (" \ "" + string.Join) ("\", \ "", फ़ील्ड्स) + "\" ");
क्रिश्चियन

2
@ Si8 तुम्हारा क्या मतलब है? यह उत्तर केवल db घटकों का उपयोग करता है, और &nbspHTML / XML दस्तावेज़ों का विशिष्ट है। यह उपरोक्त कोड नहीं है जो इसे पैदा करता है जब तक कि तालिका में &nbsp;स्पष्ट रूप से शामिल न हो
vc 74

36

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

myDataTable.WriteToCsvFile("C:\\MyDataTable.csv");

किसी भी DataTable पर।

public static class DataTableExtensions 
{
    public static void WriteToCsvFile(this DataTable dataTable, string filePath) 
    {
        StringBuilder fileContent = new StringBuilder();

        foreach (var col in dataTable.Columns) 
        {
            fileContent.Append(col.ToString() + ",");
        }

        fileContent.Replace(",", System.Environment.NewLine, fileContent.Length - 1, 1);

        foreach (DataRow dr in dataTable.Rows) 
        {
            foreach (var column in dr.ItemArray) 
            {
                fileContent.Append("\"" + column.ToString() + "\",");
            }

            fileContent.Replace(",", System.Environment.NewLine, fileContent.Length - 1, 1);
        }

        System.IO.File.WriteAllText(filePath, fileContent.ToString());
    }
}

24

पॉल ग्रिमशॉ के उत्तर पर आधारित एक नया विस्तार समारोह। मैंने इसे साफ किया और अप्रत्याशित डेटा को संभालने की क्षमता जोड़ी। (खाली डेटा, एंबेडेड कोट्स और हेडिंग में अल्पविराम ...)

यह एक स्ट्रिंग भी देता है जो अधिक लचीली होती है। यदि तालिका ऑब्जेक्ट में कोई संरचना नहीं है, तो यह अशक्त देता है।

    public static string ToCsv(this DataTable dataTable) {
        StringBuilder sbData = new StringBuilder();

        // Only return Null if there is no structure.
        if (dataTable.Columns.Count == 0)
            return null;

        foreach (var col in dataTable.Columns) {
            if (col == null)
                sbData.Append(",");
            else
                sbData.Append("\"" + col.ToString().Replace("\"", "\"\"") + "\",");
        }

        sbData.Replace(",", System.Environment.NewLine, sbData.Length - 1, 1);

        foreach (DataRow dr in dataTable.Rows) {
            foreach (var column in dr.ItemArray) {
                if (column == null)
                    sbData.Append(",");
                else
                    sbData.Append("\"" + column.ToString().Replace("\"", "\"\"") + "\",");
            }
            sbData.Replace(",", System.Environment.NewLine, sbData.Length - 1, 1);
        }

        return sbData.ToString();
    }

आप इसे इस प्रकार कहते हैं:

var csvData = dataTableOject.ToCsv();

1
यह एक यहाँ से बाहर सबसे अच्छा है। बहुत बढ़िया। धन्यवाद
Fandango68

विलक्षण समाधान। स्थानीय रूप से टिप्पणियों को जोड़ा, लेकिन पहाड़ पर चढ़े बिना बॉक्स से बाहर का उपयोग करने में सक्षम था। धन्यवाद।
j.hull

यह पसंद आया! मैंने इसे एक गैर-स्थैतिक विधि के रूप में इस्तेमाल किया और बस एक पैरामीटर के रूप में अपना डेटाटेबल पारित किया। बढ़िया काम किया, धन्यवाद।
किड कोडर

9

यदि आपका कॉलिंग कोड System.Windows.Formsअसेंबली को संदर्भित कर रहा है , तो आप मौलिक रूप से भिन्न दृष्टिकोण पर विचार कर सकते हैं। मेरी रणनीति कोड के बहुत कम लाइनों में और कॉलम और पंक्तियों के माध्यम से लूप के बिना इसे पूरा करने के लिए पहले से ही फ्रेमवर्क द्वारा प्रदान किए गए कार्यों का उपयोग करना है। नीचे दिए गए कोड क्या प्रोग्रामेटिक रूप DataGridViewसे मक्खी पर बनाते हैं और सेट करने के DataGridView.DataSourceलिए है DataTable। आगे, मैं प्रोग्रामेटिक रूप से सभी सेल (हेडर सहित) को इन DataGridViewऔर कॉल में चुनता हूँ DataGridView.GetClipboardContent(), परिणाम को विंडोज में रखता हूँ Clipboard। फिर, मैं क्लिपबोर्ड की सामग्री को एक कॉल में 'पेस्ट' करता हूं File.WriteAllText(), जिससे 'पेस्ट' के प्रारूपण को निर्दिष्ट करना सुनिश्चित होता है TextDataFormat.CommaSeparatedValue

यहाँ कोड है:

public static void DataTableToCSV(DataTable Table, string Filename)
{
    using(DataGridView dataGrid = new DataGridView())
    {
        // Save the current state of the clipboard so we can restore it after we are done
        IDataObject objectSave = Clipboard.GetDataObject();

        // Set the DataSource
        dataGrid.DataSource = Table;
        // Choose whether to write header. Use EnableWithoutHeaderText instead to omit header.
        dataGrid.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText;
        // Select all the cells
        dataGrid.SelectAll();
        // Copy (set clipboard)
        Clipboard.SetDataObject(dataGrid.GetClipboardContent());
        // Paste (get the clipboard and serialize it to a file)
        File.WriteAllText(Filename,Clipboard.GetText(TextDataFormat.CommaSeparatedValue));              

        // Restore the current state of the clipboard so the effect is seamless
        if(objectSave != null) // If we try to set the Clipboard to an object that is null, it will throw...
        {
            Clipboard.SetDataObject(objectSave);
        }
    }
}

ध्यान दें कि मैं शुरू करने से पहले क्लिपबोर्ड की सामग्री को संरक्षित करना सुनिश्चित करता हूं, और इसे एक बार पूरा करने के बाद इसे पुनर्स्थापित करता हूं, इसलिए उपयोगकर्ता को अगली बार अप्रत्याशित कचरा का एक गुच्छा नहीं मिलता है जब उपयोगकर्ता पेस्ट करने की कोशिश करता है। इस दृष्टिकोण के मुख्य कारण 1 हैं) आपकी कक्षा को संदर्भ देना है System.Windows.Forms, जो डेटा एब्स्ट्रैक्शन लेयर में नहीं हो सकता है, 2) आपकी असेंबली को .NET 4.5 फ्रेमवर्क के लिए लक्षित करना होगा, क्योंकि DataGridView 4.0 में मौजूद नहीं है। और 3) यह विधि विफल हो जाएगी यदि क्लिपबोर्ड का उपयोग किसी अन्य प्रक्रिया द्वारा किया जा रहा है।

वैसे भी, यह दृष्टिकोण आपकी स्थिति के लिए सही नहीं हो सकता है, लेकिन यह दिलचस्प है कोई भी कम नहीं है, और आपके टूलबॉक्स में एक और उपकरण हो सकता है।


1
क्लिपबोर्ड का उपयोग करने के लिए stackoverflow.com/questions/40726017/… की जरूरत नहीं है । .GetClipboardContentमूल्यों के कुछ किनारे मामलों को भी संभालता है ,", \t(यह टैब को अंतरिक्ष में परिवर्तित करता है)
स्लैई

2
यह अच्छा है, लेकिन क्या होगा अगर कोई एक ही समय में मशीन का उपयोग कर रहा है और महत्वपूर्ण क्षण में क्लिपबोर्ड पर कुछ डालता है।
अयो अदिसिना

7

मैंने हाल ही में ऐसा किया है लेकिन मेरे मूल्यों के आसपास दोहरे उद्धरण चिह्नों को शामिल किया गया है।

उदाहरण के लिए, इन दो पंक्तियों को बदलें:

sb.Append("\"" + col.ColumnName + "\","); 
...
sb.Append("\"" + row[i].ToString() + "\","); 

सुझाव के लिए धन्यवाद, लेकिन वे सभी डेटा अभी भी प्रत्येक पंक्ति के पहले सेल के भीतर हैं?
डैरेन यंग

7

को बदलने sb.Append(Environment.NewLine);का प्रयास करें sb.AppendLine();

StringBuilder sb = new StringBuilder();          
foreach (DataColumn col in dt.Columns)         
{             
    sb.Append(col.ColumnName + ',');         
}          

sb.Remove(sb.Length - 1, 1);         
sb.AppendLine();          

foreach (DataRow row in dt.Rows)         
{             
    for (int i = 0; i < dt.Columns.Count; i++)             
    {                 
        sb.Append(row[i].ToString() + ",");             
    }              

    sb.AppendLine();         
}          

File.WriteAllText("test.csv", sb.ToString());

इसके बाद दो कैरागी रिटर्न देंगे।
डैरेन यंग

ओ): @alexl: यही कारण है कि मैं मूल रूप से जा रहा था, लेकिन यह मेरे सिर के ऊपर से था, जब तक वी.एस. ऊपर निकाल दिया
नील नाइट

5

के ;बजाय डालने की कोशिश करें,

आशा करता हूँ की ये काम करेगा


5

यह और यह पढ़ें ?


बेहतर क्रियान्वयन होगा

var result = new StringBuilder();
for (int i = 0; i < table.Columns.Count; i++)
{
    result.Append(table.Columns[i].ColumnName);
    result.Append(i == table.Columns.Count - 1 ? "\n" : ",");
}

foreach (DataRow row in table.Rows)
{
    for (int i = 0; i < table.Columns.Count; i++)
    {
        result.Append(row[i].ToString());
        result.Append(i == table.Columns.Count - 1 ? "\n" : ",");
    }
}
 File.WriteAllText("test.csv", result.ToString());

5

त्रुटि सूची विभाजक है।

लिखने के बजाय sb.Append(something... + ',')आपको कुछ ऐसा करना चाहिएsb.Append(something... + System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator);

आपको अपने ऑपरेटिंग सिस्टम में कॉन्फ़िगर की गई सूची सेपरेटर कैरेक्टर (जैसे ऊपर दिए गए उदाहरण में), या क्लाइंट मशीन में लिस्ट सेपरेटर को रखना होगा जहाँ फ़ाइल देखी जा रही है। एक अन्य विकल्प यह होगा कि आप इसे अपने एप्लिकेशन के पैरामीटर के रूप में app.config या web.config में कॉन्फ़िगर करें।


5

कोड की 4 लाइनें:

public static string ToCSV(DataTable tbl)
{
    StringBuilder strb = new StringBuilder();

    //column headers
    strb.AppendLine(string.Join(",", tbl.Columns.Cast<DataColumn>()
        .Select(s => "\"" + s.ColumnName + "\"")));

    //rows
    tbl.AsEnumerable().Select(s => strb.AppendLine(
        string.Join(",", s.ItemArray.Select(
            i => "\"" + i.ToString() + "\"")))).ToList();

    return strb.ToString();
}

ध्यान दें कि ToList()अंत में महत्वपूर्ण है; मुझे अभिव्यक्ति मूल्यांकन के लिए कुछ करने की आवश्यकता है। यदि मैं कोड गोल्फिंग कर रहा होता, तो मैं Min()इसके बजाय उपयोग कर सकता था।

यह भी ध्यान दें कि अंतिम कॉल के कारण परिणाम में एक नई रेखा होगी AppendLine()। आप ऐसा नहीं चाह सकते हैं। आप बस TrimEnd()इसे हटाने के लिए कॉल कर सकते हैं ।


3

यहाँ vc-74 की पोस्ट में वृद्धि है जो एक्सेल करता है उसी तरह कॉमा को संभालता है। यदि डेटा में अल्पविराम है, लेकिन यदि डेटा में अल्पविराम नहीं है, तो Excel डेटा के चारों ओर उद्धरण डालता है।

    public static string ToCsv(this DataTable inDataTable, bool inIncludeHeaders = true)
    {
        var builder = new StringBuilder();
        var columnNames = inDataTable.Columns.Cast<DataColumn>().Select(column => column.ColumnName);
        if (inIncludeHeaders)
            builder.AppendLine(string.Join(",", columnNames));
        foreach (DataRow row in inDataTable.Rows)
        {
            var fields = row.ItemArray.Select(field => field.ToString().WrapInQuotesIfContains(","));
            builder.AppendLine(string.Join(",", fields));
        }

        return builder.ToString();
    }

    public static string WrapInQuotesIfContains(this string inString, string inSearchString)
    {
        if (inString.Contains(inSearchString))
            return "\"" + inString+ "\"";
        return inString;
    }

2

फ़ाइल में लिखने के लिए, मुझे लगता है कि निम्नलिखित विधि सबसे कुशल और सीधी है: (यदि आप चाहें तो उद्धरण जोड़ सकते हैं)

public static void WriteCsv(DataTable dt, string path)
{
    using (var writer = new StreamWriter(path)) {
        writer.WriteLine(string.Join(",", dt.Columns.Cast<DataColumn>().Select(dc => dc.ColumnName)));
        foreach (DataRow row in dt.Rows) {
            writer.WriteLine(string.Join(",", row.ItemArray));
        }
    }
}

2

एक्सेल CSV की नकल करने के लिए:

public static string Convert(DataTable dt)
{
    StringBuilder sb = new StringBuilder();

    IEnumerable<string> columnNames = dt.Columns.Cast<DataColumn>().
                                        Select(column => column.ColumnName);
    sb.AppendLine(string.Join(",", columnNames));

    foreach (DataRow row in dt.Rows)
    {
        IEnumerable<string> fields = row.ItemArray.Select(field =>
        {
            string s = field.ToString().Replace("\"", "\"\"");
            if(s.Contains(','))
                s = string.Concat("\"", s, "\"");
            return s;
        });
        sb.AppendLine(string.Join(",", fields));
    }

    return sb.ToString().Trim();
}

1
StringBuilder sb = new StringBuilder();
        SaveFileDialog fileSave = new SaveFileDialog();
        IEnumerable<string> columnNames = tbCifSil.Columns.Cast<DataColumn>().
                                          Select(column => column.ColumnName);
        sb.AppendLine(string.Join(",", columnNames));

        foreach (DataRow row in tbCifSil.Rows)
        {
            IEnumerable<string> fields = row.ItemArray.Select(field =>string.Concat("\"", field.ToString().Replace("\"", "\"\""), "\""));
            sb.AppendLine(string.Join(",", fields));
        }

        fileSave.ShowDialog();
        File.WriteAllText(fileSave.FileName, sb.ToString());

StackOverflow में आपका स्वागत है! उत्तर सर्वश्रेष्ठ होते हैं जब वे कोड स्निपेट का विवरण शामिल करते हैं। मैंने व्यक्तिगत रूप से पाया है कि जब चर नाम प्रश्न और उत्तर के बीच में होते हैं, तो वे मेरे लिए अधिक सहायक होते हैं।
एडिंकल

1
public void ExpoetToCSV(DataTable dtDataTable, string strFilePath)
{

    StreamWriter sw = new StreamWriter(strFilePath, false);
    //headers   
    for (int i = 0; i < dtDataTable.Columns.Count; i++)
    {
        sw.Write(dtDataTable.Columns[i].ToString().Trim());
        if (i < dtDataTable.Columns.Count - 1)
        {
            sw.Write(",");
        }
    }
    sw.Write(sw.NewLine);
    foreach (DataRow dr in dtDataTable.Rows)
    {
        for (int i = 0; i < dtDataTable.Columns.Count; i++)
        {
            if (!Convert.IsDBNull(dr[i]))
            {
                string value = dr[i].ToString().Trim();
                if (value.Contains(','))
                {
                    value = String.Format("\"{0}\"", value);
                    sw.Write(value);
                }
                else
                {
                    sw.Write(dr[i].ToString().Trim());
                }
            }
            if (i < dtDataTable.Columns.Count - 1)
            {
                sw.Write(",");
            }
        }
        sw.Write(sw.NewLine);
    }
    sw.Close();
}

1

संभवतः, सबसे आसान तरीका उपयोग करना होगा:

https://github.com/ukushu/DataExporter

विशेष रूप /r/nसे आपके डेटाटेबल सेल के अंदर डेटाटेबल कैरेक्टर या सेपरेटर सिंबल के आपके डेटा के मामले में । लगभग सभी अन्य उत्तर ऐसी कोशिकाओं के साथ काम नहीं करेंगे।

केवल आपको निम्नलिखित कोड लिखना है:

Csv csv = new Csv("\t");//Needed delimiter 

var columnNames = dt.Columns.Cast<DataColumn>().
    Select(column => column.ColumnName).ToArray();

csv.AddRow(columnNames);

foreach (DataRow row in dt.Rows)
{
    var fields = row.ItemArray.Select(field => field.ToString()).ToArray;
    csv.AddRow(fields);   
}

csv.Save();

0

यदि कोई अन्य व्यक्ति इस पर ठोकर खाता है, तो मैं CSV डेटा प्राप्त करने के लिए File.ReadAllText का उपयोग कर रहा था और फिर मैंने इसे संशोधित किया और इसे File.WriteAllText के साथ वापस लिखा । Excel को खोलने पर \ r \ n CRLF ठीक थे लेकिन \ t टैब को अनदेखा नहीं किया गया था। (इस थ्रेड के सभी समाधान अब तक अल्पविराम सीमांकक का उपयोग करते हैं, लेकिन इससे कोई फर्क नहीं पड़ता।) नोटपैड ने स्रोत फ़ाइल में उसी प्रारूप को दिखाया जैसा कि स्रोत में है। एक डिफ ने भी फाइलों को समान दिखाया। लेकिन मुझे एक सुराग मिला जब मैंने एक बाइनरी एडिटर के साथ विजुअल स्टूडियो में फाइल खोली। स्रोत फ़ाइल यूनिकोड थी लेकिन लक्ष्य ASCII था । ठीक करने के लिए, मैंने ReadAllText और WriteAllText दोनों को System.Text.Encoding.Unicode के रूप में तीसरे तर्क सेट के साथ संशोधित किया , और वहां से Excel अपडेट की गई फ़ाइल को खोलने में सक्षम था।


0

यूगोस्लाविय

private string ExportDatatableToCSV(DataTable dtTable)
{
    StringBuilder sbldr = new StringBuilder();
    if (dtTable.Columns.Count != 0)
    {
        foreach (DataColumn col in dtTable.Columns)
        {
            sbldr.Append(col.ColumnName + ',');
        }
        sbldr.Append("\r\n");
        foreach (DataRow row in dtTable.Rows)
        {
            foreach (DataColumn column in dtTable.Columns)
            {
                sbldr.Append(row[column].ToString() + ',');
            }
            sbldr.Append("\r\n");
        }
    }
    return sbldr.ToString();
}

0

पॉल ग्रिमशॉ और एंथनी वीओ द्वारा पिछले जवाबों के आधार पर यहां मेरा समाधान है । मैंने Github पर C # प्रोजेक्ट में कोड सबमिट किया है

मेरा मुख्य योगदान स्पष्ट रूप से बनाने और हेरफेर StringBuilderकरने के बजाय केवल साथ काम करना है IEnumerable। यह स्मृति में एक बड़े बफर के आवंटन से बचा जाता है।

public static class Util
{
    public static string EscapeQuotes(this string self) {
        return self?.Replace("\"", "\"\"") ?? "";
    }

    public static string Surround(this string self, string before, string after) {
        return $"{before}{self}{after}";
    }

    public static string Quoted(this string self, string quotes = "\"") {
        return self.Surround(quotes, quotes);
    }

    public static string QuotedCSVFieldIfNecessary(this string self) {
        return (self == null) ? "" : self.Contains('"') ? self.Quoted() : self; 
    }

    public static string ToCsvField(this string self) {
        return self.EscapeQuotes().QuotedCSVFieldIfNecessary();
    }

    public static string ToCsvRow(this IEnumerable<string> self){
        return string.Join(",", self.Select(ToCsvField));
    }

    public static IEnumerable<string> ToCsvRows(this DataTable self) {          
        yield return self.Columns.OfType<object>().Select(c => c.ToString()).ToCsvRow();
        foreach (var dr in self.Rows.OfType<DataRow>())
            yield return dr.ItemArray.Select(item => item.ToString()).ToCsvRow();
    }

    public static void ToCsvFile(this DataTable self, string path) {
        File.WriteAllLines(path, self.ToCsvRows());
    }

}

यह दृष्टिकोण यहाँ पूछेIEnumerable गए अनुसार डेटाटेबल में बदलने के साथ अच्छी तरह से जोड़ता है


0
        DataTable dt = yourData();
        StringBuilder csv = new StringBuilder();
        int dcCounter = 0;

        foreach (DataColumn dc in dt.Columns)
        {
            csv.Append(dc);
            if (dcCounter != dt.Columns.Count - 1)
            {
                csv.Append(",");
            }
            dcCounter++;
        }
        csv.AppendLine();

        int numOfDc = dt.Columns.Count;
        foreach (DataRow dr in dt.Rows)
        {
            int colIndex = 0;
            while (colIndex <= numOfDc - 1)
            {
                var colVal = dr[colIndex].ToString();
                if (colVal != null && colVal != "")
                {
                    DateTime isDateTime;
                    if (DateTime.TryParse(colVal, out isDateTime))
                    {
                        csv.Append(Convert.ToDateTime(colVal).ToShortDateString());
                    }
                    else
                    {
                        csv.Append(dr[colIndex]);
                    }
                }
                else
                {
                    csv.Append("N/A");
                }
                if (colIndex != numOfDc - 1)
                {
                    csv.Append(",");
                }
                colIndex++;
            }
            csv.AppendLine();

मुझे डेटा के कुछ ओवरराइडिंग करने की भी ज़रूरत थी, यही वजह है कि कुछ "अगर और" बयान हैं। मुझे यह सुनिश्चित करने की आवश्यकता है कि यदि कोई फ़ील्ड इसके बजाय "N / A" इनपुट करने के लिए खाली था, या यदि कोई दिनांक फ़ील्ड "01/01/1900: 00" के रूप में स्वरूपित की गई थी, तो इसे "01/01/1900" के रूप में सहेजा जाएगा बजाय।


0
StringBuilder sb = new StringBuilder();

        foreach (DataColumn col in table.Columns)
        {
            sb.Append(col.ColumnName + ";");
        }

        foreach (DataRow row in table.Rows)
        {
            sb.AppendLine();
            foreach (DataColumn col in table.Columns)
            {
                sb.Append($@"{Convert.ToString(row[col])}" + ";");
            }
        }
        File.WriteAllText(path, sb.ToString());

-1

यदि सभी डेटा अभी भी पहली सेल में हैं, तो इसका मतलब है कि आपने जिस एप्लिकेशन के साथ फ़ाइल खोली है, वह किसी अन्य सीमांकक की अपेक्षा कर रहा है। MSExcel जब तक आप अन्यथा निर्दिष्ट नहीं करते तब तक अल्पविराम के रूप में अल्पविराम को संभाल सकता है।

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