在最后一行之后将行插入csv文件

时间:2014-05-05 18:31:07

标签: c# csv streamwriter

我有一个将行插入csv文件的函数(称为:writeToCsv)。

我逐行运行该功能。

问题是:我的函数在文件的开头插入行(这就是删除前一行的原因,所以我永远不会有多行)。

我想知道如何在最后一行之后插入行。

任何帮助表示赞赏!

var filePath = @"C:\Book1.csv";
// Initialise stream object with file
using (var wr = new StreamWriter(filePath, false, Encoding.UTF8))
{
    // Collection of book titles
    var row = new List<string>();


    // insert Username to Excel
    if (userdetails.username != "")
    {
        row.Add("Username: " + userdetails.username);
    }
    else
    {
        row.Add("Username: Unknown");
    }

    row.Add("");

    var sb = new StringBuilder();

    foreach (string value in row)
    {
        // Add a comma before each string
        // this adds a comma before the book title
        if (sb.Length > 0) {
             sb.Append(",");
        }
        sb = sb.Clear();
        sb.Append(value);
        wr.WriteLine(sb.ToString());
    }
}

3 个答案:

答案 0 :(得分:8)

更改您的StreamWriter以追加:

using (var wr = new StreamWriter(filePath, true, Encoding.UTF8))

构造函数的documentation

public StreamWriter(
    string path,
    bool append,
    Encoding encoding
)

附加文件将写入其末尾,而不是覆盖它。

答案 1 :(得分:2)

我建议您使用File.AppendAllText。正如MSDN文档:

  

打开文件,将指定的字符串附加到文件中,然后   关闭文件。如果该文件不存在,则此方法创建一个   file,将指定的字符串写入文件,然后关闭文件。

因此,您可以传递path os csv文件和要添加的内容,它将为您完成,而无需管理流对象。有两个重载:

File.AppendAllText(string path, string contents);

File.AppendAllText(string path, string contents, Encoding encoding);

由于您拥有Encoding,因此请使用第二个重载:

var rows = new List<string>();

if (userdetails.username != "")
   rows.Add(string.Format("Username: {0}" userdetails.username));
else
   rows.Add("Username: Unknown");

row.Add(string.Empty);

// create the rows you need to append
StringBuilder sb = new StringBuilder();
foreach (string row in rows)
    sb.AppendFormat(",{0}", row);

// flush all rows once time.
File.AppendAllText(filePath, sb.ToString(), Encoding.UTF8);

答案 2 :(得分:1)

您使用StreamWriter并非如此。你是,只写一行。您可以更改它,但将instantion更改为类似的内容;

 using (var wr = new StreamWriter(filePath, true, Encoding.UTF8))

或者,就个人而言,如果您没有冒出OutOfMemoryException(意味着您的文件太大而无法保留在内存中)的风险,我只会简化整个事情;

  List<string> lines = File.ReallAllLines(path);
  lines.Add(String.Join(row, ","));
  File.WriteAllLines(path, lines.ToArray());

它更简单易读。