c # সিএসভিতে ডেটাটেবল


113

কেউ দয়া করে আমাকে বলতে পারেন কেন নীচের কোডটি কাজ করছে না। ডেটা সিএসভি ফাইলে সংরক্ষণ করা হয়, তবে ডেটা আলাদা করা হয় না। এটি প্রতিটি সারির প্রথম কক্ষের মধ্যে বিদ্যমান।

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());

ধন্যবাদ।



আমি উচ্চ কর্মক্ষমতা এক্সটেনশন বিকাশ। পরীক্ষা এই উত্তর
Nigje

উত্তর:


229

নিম্নলিখিত সংক্ষিপ্ত সংস্করণটি এক্সেলে সূক্ষ্মভাবে খোলে, সম্ভবত আপনার সমস্যাটি পিছনের কমা ছিল

.নেট = 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());

। নেট> = 4.0

এবং টিম যেমন উল্লেখ করেছে, আপনি। নেট> = 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
@ টিমশ্মেলটার, হ্যাঁ তবে এই ওভারলোডগুলি। নেট 4 এ প্রবর্তিত হয়েছিল, ওপি। নেট <4
ভিসি 74

18
এই পদ্ধতিটি কলাম মানটির মধ্যে কমা বিবেচনা করে না।
খ্রিস্টান

2
পরিবর্তে আইনুনামেবল <স্ট্রিং> ক্ষেত্র = সারি। আইটেমআর.ইলেক্ট করুন (ক্ষেত্র => ফিল্ড। টুস্ট্রিং () ("\", \ "", ক্ষেত্র) + "\" ");
খ্রিস্টান

2
@ সি 8 আপনার মানে কি? এই উত্তরটিতে কেবল ডিবি উপাদান ব্যবহার করা হয় এবং &nbspএটি এইচটিএমএল / এক্সএমএল নথিগুলির সাধারণ। এটি উপরের কোড নয় যা এটি তৈরি করে যদি না সারণীতে &nbsp;স্পষ্টভাবে থাকে
ভিসি 74

36

আমি এটিকে একটি এক্সটেনশন ক্লাসে গুটিয়ে রেখেছি, যা আপনাকে কল করতে দেয়:

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

যে কোনও ডেটা টেবিলের উপর।

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.hul

এই পছন্দ! আমি এটিকে অ-স্থিতিশীল পদ্ধতি হিসাবে ব্যবহার করেছি এবং আমার ডেটা টেবিলটিকে প্যারামিটার হিসাবে পাস করেছি। দুর্দান্ত কাজ করেছেন, আপনাকে ধন্যবাদ
কিড কোডার

9

যদি আপনার কলিং কোড System.Windows.Formsঅ্যাসেম্বলিকে উল্লেখ করে তবে আপনি একেবারে ভিন্ন পদ্ধতির বিষয়টি বিবেচনা করতে পারেন। আমার কৌশলটি হ'ল কোডের খুব কম কয়েকটি লাইনে এবং কলাম এবং সারিগুলির মধ্য দিয়ে লুপ না করে ফ্রেমওয়ার্কের সরবরাহ করা ফাংশনগুলি ব্যবহার করা। নীচের কোডটি যা করে তা হ'ল প্রোগ্রামিংয়ে ফ্লাইতে একটি তৈরি DataGridViewকরে এবং সেটটি সেট DataGridView.DataSourceকরে DataTable। এরপরে, আমি প্রোগ্রামটিতে উইন্ডোজে ফলাফল স্থাপন করে DataGridViewএবং কলটিতে সমস্ত শিরোনাম (শিরোনাম সহ) নির্বাচন করি । তারপরে, আমি ক্লিপবোর্ডের বিষয়বস্তুগুলিকে একটি কল হিসাবে 'পেস্ট' করেছি, যাতে 'পেস্ট' এর বিন্যাসটি নির্দিষ্ট করে দেওয়ার বিষয়টি নিশ্চিত করে ।DataGridView.GetClipboardContent()ClipboardFile.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, যা কোনও তথ্য বিমূর্ত স্তরের ক্ষেত্রে নাও হতে পারে, ২) আপনার সমাবেশকে নেট নেট 4.5 ফ্রেমওয়ার্কের জন্য লক্ষ্য করতে হবে, কারণ ডেটাগ্রিডভিউ ৪.০-তে বিদ্যমান নেই, এবং 3) ক্লিপবোর্ড অন্য কোনও প্রক্রিয়া দ্বারা ব্যবহৃত হচ্ছে যদি পদ্ধতিটি ব্যর্থ হবে।

যাইহোক, এই পদ্ধতিরটি আপনার পরিস্থিতির জন্য সঠিক নাও হতে পারে তবে এটি আকর্ষণীয়ও কম নয়, এবং আপনার টুলবক্সে অন্য একটি সরঞ্জাম হতে পারে।


1
ক্লিপবোর্ড ব্যবহার করার প্রয়োজন নেই stackoverflow.com/questions/40726017/….GetClipboardContentমান সহ কয়েকটি ধরণের কেস পরিচালনা করে ,", \t(এটি ট্যাবকে মহাকাশে রূপান্তর করে)
স্লাই

2
এটি ভাল, তবে যদি কেউ একই সময়ে মেশিনটি ব্যবহার করে এবং জটিল মুহুর্তে ক্লিপবোর্ডে কিছু রাখে what
অায়ো আদেসিনা

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());

এরপরে দুটি ক্যারিগ রিটার্ন দেবে।
ড্যারেন ইয়াং

@ অ্যাক্সেল: আমি মূলত যাচ্ছিলাম, তবে ভিএস বহিস্কারের আগ পর্যন্ত এটি আমার মাথার উপর থেকে ছিল: ও)
নীল নাইট

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

এখানে ভিসি -৪৪ এর পোস্টের বর্ধন রয়েছে যা এক্সেলের মতোই কমাগুলি পরিচালনা করে। এক্সেল ডেটার চারপাশে কোট রাখে যদি ডেটাতে কমা থাকে তবে ডেটাতে কমা না থাকলে উদ্ধৃতি দেয় না।

    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

এক্সেল সিএসভি অনুকরণ করতে:

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());

স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম! কোড স্নিপেটের বিবরণ অন্তর্ভুক্ত করার সময় উত্তরগুলি সেরা হয়। আমি ব্যক্তিগতভাবে খুঁজে পেয়েছি যে পরিবর্তনশীল নামগুলি যখন প্রশ্ন এবং উত্তরগুলির মধ্যে সীমাবদ্ধ থাকে, তখন তারা আমার পক্ষে আরও সহায়ক হয়।
এউইঙ্কল

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

অন্য কেউ যদি এতে হোঁচট খায় তবে আমি সিএসভি ডেটা পেতে ফাইল.আরআডএলটেক্সট ব্যবহার করছিলাম এবং তারপরে আমি এটি সংশোধন করে ফাইলের সাথে লিখেছিলাম rite রাইটআলটেক্সট । \ R \ n সিআরএলএফগুলি ভাল ছিল তবে এক্সেল এটি খুললে \ t ট্যাবগুলি অগ্রাহ্য করা হয়েছিল। (এই থ্রেডের সমস্ত সমাধান এখনও পর্যন্ত কমা ডিলিমিটার ব্যবহার করে তবে তাতে কিছু যায় আসে না)) নোটপ্যাড উত্সের মতো ফলাফলের ফাইলে একই বিন্যাসটি দেখিয়েছে। একটি ডিফ এমনকি ফাইলগুলি অভিন্ন হিসাবে দেখায়। আমি যখন বাইনারি সম্পাদক দিয়ে ভিজ্যুয়াল স্টুডিওতে ফাইলটি খুলি তখন আমি একটি ক্লু পেয়েছিলাম। উত্স ফাইলটি ইউনিকোড ছিল তবে লক্ষ্য ছিল এএসসিআইআই । ফিক্স করার জন্য, আমি তৃতীয় যুক্তি সেট দিয়ে উভয় ReadAllText এবং WriteAllText পরিবর্তিত System.Text.Encoding.Unicode , এবং এক্সেল আপডেট ফাইল খোলার জন্য সক্ষম হন।


0

FYR

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

পল গ্রিমশো এবং অ্যান্টনি ভিওর পূর্ববর্তী উত্তরের ভিত্তিতে আমার সমাধানটি এখানে । আমি গিথুবের একটি সি # প্রকল্পে কোডটি জমা দিয়েছি ।

আমার মূল অবদান স্পষ্টভাবে তৈরি এবং একটি সাধিত নিষ্কাশন করা হয় 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 DataTable রূপান্তর সঙ্গে সুন্দর একত্রিত করে ।


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 কমাটি ডিলিমিটার হিসাবে পরিচালনা করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.