我有一个将行插入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());
}
}
答案 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());
它更简单易读。