การเขียนข้อมูลลงในไฟล์ CSV ใน C #


198

ฉันพยายามเขียนลงcsvไฟล์แบบเรียงต่อกันโดยใช้ภาษา C # นี่คือหน้าที่ของฉัน

string first = reader[0].ToString();
string second=image.ToString();
string csv = string.Format("{0},{1}\n", first, second);
File.WriteAllText(filePath, csv);

ฟังก์ชั่นทั้งหมดทำงานภายในวงและทุกแถวควรเขียนลงcsvไฟล์ ในกรณีของฉันแถวถัดไปจะเขียนทับแถวที่มีอยู่และท้ายที่สุดฉันได้รับการบันทึกเดียวในไฟล์ csv ซึ่งเป็นระเบียนสุดท้าย ฉันจะเขียนแถวทั้งหมดในcsvไฟล์ได้อย่างไร?


แทนที่จะใช้ a StringBuilderแล้วทำการบันทึก
Johan

1
หากนี่ไม่ใช่งานที่คุณต้องเติมเต็มทุกวันฉันขอแนะนำให้ใช้ LinqPad ซึ่งมาพร้อมกับฟังก์ชั่นที่ใช้งานง่ายในการเขียนข้อมูลลงใน csv:Util.WriteCsv (mydatacollection, @"c:\temp\data.csv");
Marco

3
ในหมายเหตุด้านตรวจสอบให้แน่ใจว่าค่า csv ของคุณถูกเข้ารหัสแล้ว นั่นคือถ้าหนึ่งในนั้นมีเครื่องหมายจุลภาคหรืออักขระสิ้นสุดบรรทัดอาจทำให้ไฟล์ของคุณยุ่งเหยิง ฉันมักจะใช้ lib บุคคลที่สามสำหรับเนื้อหา csv
Matthijs Wessels

@MatthijsWessels คำแนะนำห้องสมุดใด ๆ ?
Arash Motamedi

คำตอบ:


313

UPDATE

ย้อนกลับไปในวันที่ไร้เดียงสาของฉันฉันแนะนำให้ทำสิ่งนี้ด้วยตนเอง (มันเป็นคำตอบง่ายๆสำหรับคำถามง่าย ๆ ) แต่เนื่องจากสิ่งนี้ได้รับความนิยมมากขึ้นเรื่อย ๆ ฉันแนะนำให้ใช้ไลบรารี่ CsvHelper ที่ทำการตรวจสอบความปลอดภัยทั้งหมดเป็นต้น

CSV มีความซับซ้อนกว่าคำถาม / คำตอบที่แนะนำ

คำตอบเดิม

เมื่อคุณมีวงอยู่แล้วให้ลองทำแบบนี้:

//before your loop
    var csv = new StringBuilder();

//in your loop
    var first = reader[0].ToString();
    var second = image.ToString();
    //Suggestion made by KyleMit
    var newLine = string.Format("{0},{1}", first, second);
    csv.AppendLine(newLine);  

//after your loop
    File.WriteAllText(filePath, csv.ToString());

หรือบางสิ่งบางอย่างกับผลกระทบนี้ เหตุผลของฉันคือคุณไม่จำเป็นต้องเขียนไฟล์ทุกรายการคุณจะเปิดกระแสได้เพียงครั้งเดียวจากนั้นจึงเขียนลงไป

คุณสามารถแทนที่

File.WriteAllText(filePath, csv.ToString());

กับ

File.AppendAllText(filePath, csv.ToString());

หากคุณต้องการเก็บ csv รุ่นก่อนหน้าไว้ในไฟล์เดียวกัน

C # 6

หากคุณใช้ c # 6.0 คุณสามารถทำสิ่งต่อไปนี้

var newLine = $"{first},{second}"

แก้ไข

นี่คือลิงค์ไปยังคำถามที่อธิบายสิ่งที่Environment.NewLineทำ


1
@Rajat ไม่เพราะ 2 เป็นบรรทัดใหม่
โจฮาน

4
นอกจากนี้คุณยังสามารถกำจัด{2}และEnvironment.NewLineและใช้AppendLineแทนAppend
KyleMit

37
และจะเกิดอะไรขึ้นเมื่อเนื้อหา CSV ของคุณมีเครื่องหมายจุลภาคที่ต้องการหลีกเลี่ยง คุณต้องการคำพูด และเกิดอะไรขึ้นเมื่อคำพูดต้องการหนี? การสร้างไฟล์ CSV นั้นซับซ้อนกว่าคำตอบนี้มาก
MgSam

1
ฉันได้รับ "exceptionType": "System.UnauthorizedAccessException",
Chit Khine

3
ฉันลองใช้วิธีแก้ปัญหาของคุณแล้ว แต่สำหรับฉัน (วัฒนธรรมฝรั่งเศส) มันใช้งานได้ดีกว่าโดยใช้System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparatorคอมม่าแทน
A.Pissicat

89

ฉันขอแนะนำให้คุณไปเส้นทางที่น่าเบื่อมากขึ้น โดยเฉพาะอย่างยิ่งถ้าขนาดไฟล์ของคุณใหญ่

using(var w = new StreamWriter(path))
{
    for( /* your loop */)
    {
        var first = yourFnToGetFirst();
        var second = yourFnToGetSecond();
        var line = string.Format("{0},{1}", first, second);
        w.WriteLine(line);
        w.Flush();
    }
}

File.AppendAllText()เปิดไฟล์ใหม่เขียนเนื้อหาแล้วปิดไฟล์ การเปิดไฟล์เป็นการดำเนินการที่ใช้ทรัพยากรจำนวนมากมากกว่าการเขียนข้อมูลลงใน open stream การเปิด \ ปิดไฟล์ภายในลูปจะทำให้ประสิทธิภาพลดลง

วิธีการที่โจฮานแนะนำให้แก้ปัญหานั้นโดยการเก็บเอาท์พุททั้งหมดในหน่วยความจำแล้วเขียนมันอีกครั้ง อย่างไรก็ตาม (ในกรณีของไฟล์ขนาดใหญ่) โปรแกรมของคุณจะใช้ RAM เป็นจำนวนมากและอาจเกิดปัญหากับOutOfMemoryException

ข้อดีอีกข้อของโซลูชันของฉันคือคุณสามารถใช้การหยุดชั่วคราว \ กลับมาทำงานต่อได้โดยบันทึกตำแหน่งปัจจุบันในข้อมูลอินพุต

UPD วางโดยใช้ในสถานที่ที่เหมาะสม


1
คุณควรใส่ของคุณสำหรับวงภายในusingคำสั่ง มิฉะนั้นคุณจะเปิดไฟล์อีกครั้งตลอดเวลาซ้ำแล้วซ้ำอีก
Oliver

2
คำตอบที่ดี. คำตอบที่ถูกต้องหากคุณลบ "{2}" ออกจากสตริงรูปแบบและแทนที่ "image" ด้วย "second" ในบรรทัดเดียวกัน อย่าลืมปิดผู้เขียนด้วย w.Close (); w.Flush () ไม่จำเป็น
movAX13h

6
คำตอบนี้ไม่จำเป็นต้องหลบหนีจากตัวละคร
MgSam

เราสามารถเพิ่มว่ามันจะช่วยให้การตั้งค่านักเขียนของคุณเช่นนี้: StreamWriter ใหม่ (เส้นทาง, เท็จ, การเข้ารหัส .
UTF8

หากคุณมีสองสามร้อยล้านบรรทัด ... คุณควรล้างข้อมูลทุกบรรทัดหรือไม่
Ardianto Suhendar

31

การเขียนไฟล์ csv ด้วยมืออาจเป็นเรื่องยากเพราะข้อมูลของคุณอาจมีเครื่องหมายจุลภาคและบรรทัดใหม่ ฉันขอแนะนำให้คุณใช้ห้องสมุดที่มีอยู่แทน

คำถามนี้กล่าวถึงตัวเลือกไม่กี่

มีผู้อ่าน / นักเขียนห้องสมุด CSV ใน C # หรือไม่


4
นี่คือคำตอบที่ถูกต้องเพียงเหตุผลเดียวที่นี่ มันน่าละอายที่คำตอบที่ไม่ดีอื่น ๆ ที่พยายามทำด้วยมือมี upvotes มากมาย
MgSam

17

ฉันใช้วิธีแยกวิเคราะห์สองวิธีเนื่องจากง่ายต่อการบำรุงรักษา

// Prepare the values
var allLines = (from trade in proposedTrades
                select new object[] 
                { 
                    trade.TradeType.ToString(), 
                    trade.AccountReference, 
                    trade.SecurityCodeType.ToString(), 
                    trade.SecurityCode, 
                    trade.ClientReference, 
                    trade.TradeCurrency, 
                    trade.AmountDenomination.ToString(), 
                    trade.Amount, 
                    trade.Units, 
                    trade.Percentage, 
                    trade.SettlementCurrency, 
                    trade.FOP, 
                    trade.ClientSettlementAccount, 
                    string.Format("\"{0}\"", trade.Notes),                             
                }).ToList();

// Build the file content
var csv = new StringBuilder();
allLines.ForEach(line => 
{
    csv.AppendLine(string.Join(",", line));            
});

File.WriteAllText(filePath, csv.ToString());

1
คุณอาจพบว่าคุณต้องเผชิญกับแรงกดดันหน่วยความจำด้วยวิธีการนี้เมื่อสร้างไฟล์ขนาดใหญ่ หากคุณลบ. ToList ดังนั้น allLines จะเป็น <IEnumerbale <object []> จากนั้นคุณสามารถเลือกว่าแทนที่จะเป็น "สำหรับการสร้างแต่ละรายการ" คือ allines เลือก (บรรทัด => csv.AppendLine (string.Join (",", บรรทัด))) ซึ่งจะให้ IEnumerable <string> ตอนนี้สามารถส่งผ่านไปยังไฟล์ได้ แต่เมธอด WriteAllLines ตอนนี้หมายความว่าทุกอย่างขี้เกียจและคุณไม่จำเป็นต้องดึงทุกอย่างเข้าสู่ความทรงจำ แต่คุณยังได้ไวยากรณ์ที่คุณพอใจ
RhysC

ฉันใช้วิธีการของคุณเพื่อเขียนไฟล์ csv มันยอดเยี่ยมมาก! การใช้งานล่าสุดของฉันต้องการให้ฉันใช้File.AppendAllLines(filePath, lines, Encoding.ASCII);แทนFile.WriteAllText(filePath, csv.ToString()); ดังนั้นฉันกำลังทำบางสิ่งที่ไม่น่าสนใจ หลังจากสร้าง csv โดยใช้ StringBuilder ฉันจะแปลงเป็น List <string> เพื่อรับ IEnumerable สำหรับการเรียกไปที่ AppendAllLines ซึ่งจะไม่ยอมรับ csv.ToString () เป็นพารามิเตอร์: List<string> lines = new List<string>(); lines.Add(csv.ToString(0, csv.Length));คุณมีวิธีที่ดีกว่าในการทำเช่นนี้หรือไม่?
Patricia

12

แทนที่จะโทรทุกครั้งที่AppendAllText()คุณนึกถึงการเปิดไฟล์หนึ่งครั้งแล้วเขียนเนื้อหาทั้งหมดหนึ่งครั้ง:

var file = @"C:\myOutput.csv";

using (var stream = File.CreateText(file))
{
    for (int i = 0; i < reader.Count(); i++)
    {
        string first = reader[i].ToString();
        string second = image.ToString();
        string csvRow = string.Format("{0},{1}", first, second);

        stream.WriteLine(csvRow);
    }
}

@aMazing: ขออภัยพิมพ์ผิด ได้รับการแก้ไขแล้ว
โอลิเวอร์

คำตอบนี้รวมถึงส่วนขยายที่ต้องเป็น csv หากเป็น xls ข้อมูลทั้งหมดจะปรากฏในหนึ่งคอลัมน์ ... csv จะปรากฏอย่างถูกต้องในแต่ละคอลัมน์
gman

11

เพียงใช้ AppendAllText แทน:

File.AppendAllText(filePath, csv);

ข้อเสียเพียงอย่างเดียวของ AppendAllText ก็คือมันจะเกิดข้อผิดพลาดเมื่อไม่มีไฟล์ดังนั้นจึงต้องทำการตรวจสอบ

ขออภัยขณะนี้สีบลอนด์ก่อนที่จะอ่านเอกสาร อย่างไรก็ตามเมธอด WriteAllText จะเขียนทับสิ่งใดก็ตามที่เคยเขียนไว้ในไฟล์หากไฟล์นั้นมีอยู่

โปรดทราบว่ารหัสปัจจุบันของคุณไม่ได้ใช้บรรทัดใหม่ที่เหมาะสมตัวอย่างเช่นใน Notepad คุณจะเห็นว่ามันเป็นเส้นยาวหนึ่งบรรทัด เปลี่ยนรหัสเป็นสิ่งนี้เพื่อให้มีบรรทัดใหม่ที่เหมาะสม:

string csv = string.Format("{0},{1}{2}", first, image, Environment.NewLine);

2
@Rajat ไม่นี่จะเขียนอักขระบรรทัดใหม่ทันทีหลังจากข้อมูลรูปภาพของคุณ
Shadow Wizard คือหูสำหรับคุณ

7

แทนที่จะใช้ล้อใหม่ในการทำให้ห้องสมุดสามารถใช้งานได้ CsvHelperเหมาะสำหรับการสร้างและอ่านไฟล์ csv มันอ่านและเขียนการดำเนินงานเป็นไปตามกระแสดังนั้นจึงสนับสนุนการดำเนินงานที่มีข้อมูลจำนวนมาก


คุณสามารถเขียน csv ของคุณดังต่อไปนี้

using(var textWriter = new StreamWriter(@"C:\mypath\myfile.csv"))
{
    var writer = new CsvWriter(textWriter, CultureInfo.InvariantCulture);
    writer.Configuration.Delimiter = ",";

    foreach (var item in list)
    {
        writer.WriteField( "a" );
        writer.WriteField( 2 );
        writer.WriteField( true );
        writer.NextRecord();
    }
}

ขณะที่ไลบรารีกำลังใช้การสะท้อนมันจะใช้ชนิดใด ๆ และแยกวิเคราะห์โดยตรง

public class CsvRow
{
    public string Column1 { get; set; }
    public bool Column2 { get; set; }

    public CsvRow(string column1, bool column2)
    {
        Column1 = column1;
        Column2 = column2;
    }
}

IEnumerable<CsvRow> rows = new [] {
    new CsvRow("value1", true),
    new CsvRow("value2", false)
};
using(var textWriter = new StreamWriter(@"C:\mypath\myfile.csv")
{
    var writer = new CsvWriter(textWriter, CultureInfo.InvariantCulture);
    writer.Configuration.Delimiter = ",";
    writer.WriteRecords(rows);
}

value1 จริง

value2 เท็จ


หากคุณต้องการอ่านเพิ่มเติมเกี่ยวกับการกำหนดค่า librarys และเป็นไปได้ที่คุณสามารถทำได้เพื่อให้ที่นี่


คุณอาจต้องส่ง CultureInfo ไปที่ StreamWriter เพื่อให้มันใช้งานได้
พยัญชนะ

6
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;

public partial class CS : System.Web.UI.Page
{
    protected void ExportCSV(object sender, EventArgs e)
    {
        string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
        using (SqlConnection con = new SqlConnection(constr))
        {
            using (SqlCommand cmd = new SqlCommand("SELECT * FROM Customers"))
            {
                using (SqlDataAdapter sda = new SqlDataAdapter())
                {
                    cmd.Connection = con;
                    sda.SelectCommand = cmd;
                    using (DataTable dt = new DataTable())
                    {
                        sda.Fill(dt);

                        //Build the CSV file data as a Comma separated string.
                        string csv = string.Empty;

                        foreach (DataColumn column in dt.Columns)
                        {
                            //Add the Header row for CSV file.
                            csv += column.ColumnName + ',';
                        }

                        //Add new line.
                        csv += "\r\n";

                        foreach (DataRow row in dt.Rows)
                        {
                            foreach (DataColumn column in dt.Columns)
                            {
                                //Add the Data rows.
                                csv += row[column.ColumnName].ToString().Replace(",", ";") + ',';
                            }

                            //Add new line.
                            csv += "\r\n";
                        }

                        //Download the CSV file.
                        Response.Clear();
                        Response.Buffer = true;
                        Response.AddHeader("content-disposition", "attachment;filename=SqlExport.csv");
                        Response.Charset = "";
                        Response.ContentType = "application/text";
                        Response.Output.Write(csv);
                        Response.Flush();
                        Response.End();
                    }
                }
            }
        }
    }
}

ทำไมไม่มีตัวสร้างสตริงที่นี่
Seabizkit

1
ซึ่ง RFC คุณใช้ในการเขียนนี้ .Replace(",", ";") + ',' ?
vt100

วิธีนี้ใช้เวลานานเกินไปถ้าคุณมีมากกว่า20,000 แถวและ 30 คอลัมน์
Vikrant

3

การจัดการจุลภาค

สำหรับการจัดการเครื่องหมายจุลภาคภายในค่าเมื่อใช้string.Format(...)งานสิ่งต่อไปนี้ใช้ได้สำหรับฉัน:

var newLine = string.Format("\"{0}\",\"{1}\",\"{2}\"",
                              first,
                              second,
                              third                                    
                              );
csv.AppendLine(newLine);

ดังนั้นเมื่อรวมเข้ากับคำตอบของ Johan มันจะมีลักษณะเช่นนี้:

//before your loop
var csv = new StringBuilder();

//in your loop
  var first = reader[0].ToString();
  var second = image.ToString();
  //Suggestion made by KyleMit
  var newLine = string.Format("\"{0}\",\"{1}\"", first, second);
  csv.AppendLine(newLine);  

//after your loop
File.WriteAllText(filePath, csv.ToString());

ส่งคืนไฟล์ CSV

หากคุณเพียงต้องการส่งคืนไฟล์แทนที่จะเขียนไปยังสถานที่นี่เป็นตัวอย่างของวิธีการที่ฉันทำมันสำเร็จ:

จากขั้นตอนการจัดเก็บ

public FileContentResults DownloadCSV()
{
  // I have a stored procedure that queries the information I need
  SqlConnection thisConnection = new SqlConnection("Data Source=sv12sql;User ID=UI_Readonly;Password=SuperSecure;Initial Catalog=DB_Name;Integrated Security=false");
  SqlCommand queryCommand = new SqlCommand("spc_GetInfoINeed", thisConnection);
  queryCommand.CommandType = CommandType.StoredProcedure;

  StringBuilder sbRtn = new StringBuilder();

  // If you want headers for your file
  var header = string.Format("\"{0}\",\"{1}\",\"{2}\"",
                             "Name",
                             "Address",
                             "Phone Number"
                            );
  sbRtn.AppendLine(header);

  // Open Database Connection
  thisConnection.Open();
  using (SqlDataReader rdr = queryCommand.ExecuteReader())
  {
    while (rdr.Read())
    {
      // rdr["COLUMN NAME"].ToString();
      var queryResults = string.Format("\"{0}\",\"{1}\",\"{2}\"",
                                        rdr["Name"].ToString(),
                                        rdr["Address"}.ToString(),
                                        rdr["Phone Number"].ToString()
                                       );
      sbRtn.AppendLine(queryResults);
    }
  }
  thisConnection.Close();

  return File(new System.Text.UTF8Encoding().GetBytes(sbRtn.ToString()), "text/csv", "FileName.csv");
}

จากรายการ

/* To help illustrate */
public static List<Person> list = new List<Person>();

/* To help illustrate */
public class Person
{
  public string name;
  public string address;
  public string phoneNumber;
}

/* The important part */
public FileContentResults DownloadCSV()
{
  StringBuilder sbRtn = new StringBuilder();

  // If you want headers for your file
  var header = string.Format("\"{0}\",\"{1}\",\"{2}\"",
                             "Name",
                             "Address",
                             "Phone Number"
                            );
  sbRtn.AppendLine(header);

  foreach (var item in list)
  {
      var listResults = string.Format("\"{0}\",\"{1}\",\"{2}\"",
                                        item.name,
                                        item.address,
                                        item.phoneNumber
                                       );
      sbRtn.AppendLine(listResults);
    }
  }

  return File(new System.Text.UTF8Encoding().GetBytes(sbRtn.ToString()), "text/csv", "FileName.csv");
}

หวังว่านี่จะเป็นประโยชน์


2

นี่คือบทแนะนำอย่างง่ายเกี่ยวกับการสร้างไฟล์ csv โดยใช้ C # ที่คุณจะสามารถแก้ไขและขยายเพื่อให้เหมาะกับความต้องการของคุณเอง

ก่อนอื่นคุณจะต้องสร้างแอปพลิเคชันคอนโซล Visual Studio C # ใหม่มีขั้นตอนในการทำเช่นนี้

โค้ดตัวอย่างจะสร้างไฟล์ csv ชื่อ MyTest.csv ในตำแหน่งที่คุณระบุ เนื้อหาของไฟล์ควรเป็น 3 คอลัมน์ที่มีชื่อพร้อมข้อความใน 3 แถวแรก

https://tidbytez.com/2018/02/06/how-to-create-a-csv-file-with-c/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace CreateCsv
{
    class Program
    {
        static void Main()
        {
            // Set the path and filename variable "path", filename being MyTest.csv in this example.
            // Change SomeGuy for your username.
            string path = @"C:\Users\SomeGuy\Desktop\MyTest.csv";

            // Set the variable "delimiter" to ", ".
            string delimiter = ", ";

            // This text is added only once to the file.
            if (!File.Exists(path))
            {
                // Create a file to write to.
                string createText = "Column 1 Name" + delimiter + "Column 2 Name" + delimiter + "Column 3 Name" + delimiter + Environment.NewLine;
                File.WriteAllText(path, createText);
            }

            // This text is always added, making the file longer over time
            // if it is not deleted.
            string appendText = "This is text for Column 1" + delimiter + "This is text for Column 2" + delimiter + "This is text for Column 3" + delimiter + Environment.NewLine;
            File.AppendAllText(path, appendText);

            // Open the file to read from.
            string readText = File.ReadAllText(path);
            Console.WriteLine(readText);
        }
    }
}

2
ยินดีต้อนรับลิงก์ไปยังโซลูชัน แต่โปรดตรวจสอบให้แน่ใจว่าคำตอบของคุณมีประโยชน์หากไม่มี: เพิ่มบริบทรอบลิงก์เพื่อให้ผู้ใช้เพื่อนของคุณมีความคิดว่ามันคืออะไรและเพราะเหตุใดจึงอยู่ที่นั่น กำลังเชื่อมโยงไปยังในกรณีที่หน้าเป้าหมายไม่พร้อมใช้งาน คำตอบที่น้อยกว่าลิงก์อาจถูกลบ
Shree

ฉันเข้าใจแล้ว ขอบคุณสำหรับความคิดเห็น. ฉันได้ทำการเปลี่ยนแปลงที่ไฮไลต์ กรุณาขึ้นคะแนน
Bloggins


0

นี่คือห้องสมุดโอเพนซอร์ซอีกแห่งหนึ่งที่สร้างไฟล์ CSV ได้อย่างง่ายดายCinchoo ETL

List<dynamic> objs = new List<dynamic>();

dynamic rec1 = new ExpandoObject();
rec1.Id = 10;
rec1.Name = @"Mark";
rec1.JoinedDate = new DateTime(2001, 2, 2);
rec1.IsActive = true;
rec1.Salary = new ChoCurrency(100000);
objs.Add(rec1);

dynamic rec2 = new ExpandoObject();
rec2.Id = 200;
rec2.Name = "Tom";
rec2.JoinedDate = new DateTime(1990, 10, 23);
rec2.IsActive = false;
rec2.Salary = new ChoCurrency(150000);
objs.Add(rec2);

using (var parser = new ChoCSVWriter("emp.csv").WithFirstLineHeader())
{
    parser.Write(objs);
}

สำหรับข้อมูลเพิ่มเติมโปรดอ่านบทความCodeProjectเกี่ยวกับการใช้งาน


0

วิธีง่ายๆในการกำจัดปัญหาการเขียนทับคือการใช้File.AppendTextบรรทัดต่อท้ายไฟล์ดังนี้

void Main()
{
    using (System.IO.StreamWriter sw = System.IO.File.AppendText("file.txt"))
    {          
        string first = reader[0].ToString();
        string second=image.ToString();
        string csv = string.Format("{0},{1}\n", first, second);
        sw.WriteLine(csv);
    }
} 

0
enter code here

string string_value = string.Empty;

        for (int i = 0; i < ur_grid.Rows.Count; i++)
        {
            for (int j = 0; j < ur_grid.Rows[i].Cells.Count; j++)
            {
                if (!string.IsNullOrEmpty(ur_grid.Rows[i].Cells[j].Text.ToString()))
                {
                    if (j > 0)
                        string_value= string_value+ "," + ur_grid.Rows[i].Cells[j].Text.ToString();
                    else
                    {
                        if (string.IsNullOrEmpty(string_value))
                            string_value= ur_grid.Rows[i].Cells[j].Text.ToString();
                        else
                            string_value= string_value+ Environment.NewLine + ur_grid.Rows[i].Cells[j].Text.ToString();
                    }
                }
            }
        }


        string where_to_save_file = @"d:\location\Files\sample.csv";
        File.WriteAllText(where_to_save_file, string_value);

        string server_path = "/site/Files/sample.csv";
        Response.ContentType = ContentType;
        Response.AppendHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(server_path));
        Response.WriteFile(server_path);
        Response.End();

0
public static class Extensions
{
    public static void WriteCSVLine(this StreamWriter writer, IEnumerable<string> fields)
    {
        const string q = @"""";
        writer.WriteLine(string.Join(",",
            fields.Select(
                v => (v.Contains(',') || v.Contains('"') || v.Contains('\n') || v.Contains('\r')) ? $"{q}{v.Replace(q, q + q)}{q}" : v
                )));
    }

    public static void WriteFields(this StreamWriter writer, params string[] fields) => WriteFields(writer, (IEnumerable<string>)fields);
}

สิ่งนี้จะช่วยให้คุณเขียนไฟล์ csv ได้ค่อนข้างง่าย การใช้งาน:

StreamWriter writer = new StreamWriter("myfile.csv");
writer.WriteCSVLine(new[]{"A", "B"});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.