我正在编写一个迭代文件树的程序,现在我需要它将结果写入csv文件。在写入csv文件之前,需要按字母数字顺序对内容进行排序。所以我一直把文件保存到List。
FileInfo fi = new FileInfo(file);
fileList.Add( new Record {
fileName = fi.Name,
fileSize = fi.Length
});
记录是一个类:
public class Record
{
public long fileSize { get; set; }
public string fileName { get; set; }
}
然后我正在做一个普通的旧Sort()。现在我该如何将此列表写入csv? 我欢迎任何更好的方法来完成整个过程。
有没有办法可以在我去的时候将结果写入csv然后按字母顺序对csv进行排序?基本上程序必须对它进行排序而不是用户。
csv也需要标题,如果你能让我继续这样做。
答案 0 :(得分:1)
只要你能够将所有数据都放在内存中,你最好抓住它并将其分类到内存而不是将其写入文件。在文件中对数据进行排序的概念通常通过“将其读入内存,对其进行排序,然后再将其写回”来解决。
至于写一个CSV文件,它并不是那么难。我喜欢使用StringBuilder来添加每行的每个字段,然后一旦我有一行我将该行附加到该文件。对于标题,您可以根据需要对它们进行硬编码,或者如果它是动态的,则从任何来源获取它们。你不知道怎么写文件吗?我的猜测是File.WriteAllText()和File.AppendText()方法将是您应该需要的所有方法。
只是一个一般的提示,因为你问,是,而不是将项目添加到列表,因为你最终将它们全部排序,是将它们添加到SortedList,以便它们按照你的方式排序。然后,当你完成后,你只需要一次获得它们,它们已经处于有序状态。
答案 1 :(得分:0)
您可以使用LINQ进行排序,使用StreamWriter
进行文件创建。
using (var writer = new StreamWriter(@"C:\files.csv")) {
writer.WriteLine("Name,Size"); // Header
var query = fileList.OrderBy(r => r.fileName);
foreach (Record record in query) {
writer.WriteLine("\"{0}\",{1}", record.fileName, record.fileSize);
}
}
请注意,如果逗号(,)是文件名的一部分,我将文件名括在双引号(“)中。双引号本身不是Windows中文件名的有效字符,因此这应该不是问题。