使用C#将数据写入CSV文件

264

我正在尝试使用C#语言逐行向一个csv文件写入数据,以下是我的函数:

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文件中?


最好使用 StringBuilder 然后再保存一次吗? - Johan
1
如果这不是您每天需要完成的任务,我建议使用 LinqPad,它带有一个方便的函数,可以将数据写入 csv:Util.WriteCsv(mydatacollection, @"c:\temp\data.csv"); - Marco
3
顺便提一下,请确保您的 CSV 值已经编码。例如,如果其中一个包含逗号或换行符,则可能会破坏您的文件。通常我会使用第三方库处理 CSV 相关的事情。 - Matthijs Wessels
@Marco 为什么不每天执行那个任务很重要? - Vandrey
2
只需使用File.AppendAllText - 您需要追加文本,而不是写入。 - Vincent
显示剩余3条评论
16个回答

3
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 WriteCSVLine(this StreamWriter writer, params string[] fields) => WriteCSVLine(writer, (IEnumerable<string>)fields);
}

这应该能让你很简单地编写一个CSV文件。用法:
StreamWriter writer = new ("myfile.csv");
writer.WriteCSVLine("A", "B"); // A,B

1

(免责声明:我即将推荐一个我参与的项目)

自2015年以来,我一直在维护一个开源的CSV写入库:https://github.com/jitbit/CsvExport

它与Excel兼容,可以转义逗号/引号/多行文本,以时区证明的格式导出日期等。它是.NET标准2.0,可与.NET Core和.NET Framework一起使用。

用法:

var myExport = new CsvExport();

myExport.AddRow();
myExport["Region"] = "Denver, USA";
myExport["Sales"] = 100000;
myExport["Date Opened"] = new DateTime(2003, 12, 31);

myExport.AddRow();
myExport["Region"] = "London \"in\" the UK";
myExport["Sales"] = 50000;
myExport["Date Opened"] = new DateTime(2005, 1, 1, 9, 30, 0);

//ASP.NET MVC action example
return File(myExport.ExportToBytes(), "text/csv", "results.csv");

Nuget上可用:

Install-Package CsvExport

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

这是另一个用于轻松创建 CSV 文件的开源库,Cinchoo ETL

方法 1:动态模型

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

方法二:POCO 模型

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

Emp rec1 = new Emp();
rec1.Id = 10;
rec1.Name = @"Mark";
objs.Add(rec1);

Emp rec2 = new Emp();
rec2.Id = 200;
rec2.Name = "Tom";
objs.Add(rec2);

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

如需更多信息,请阅读CodeProject上有关使用的文章。


0
enter code here

字符串 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();

-1

你可能只需要添加一个换行符 "\n\r"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接