0

我正在编写一个迭代文件树的程序,现在我需要它将结果写入 csv 文件。在写入 csv 文件之前,要求内容按字母数字顺序排序。所以我一直将文件保存到列表中。

FileInfo fi = new FileInfo(file);
fileList.Add( new Record {
    fileName = fi.Name,
    fileSize = fi.Length
});

其中 Record 是一个类:

public class Record
{
    public long fileSize { get; set; }
    public string fileName { get; set; }

}

然后我正在做一个普通的旧排序()。现在我怎样才能将此列表写入 csv?我欢迎任何更好的方法来完成整个过程。

有没有一种方法可以将结果写入 csv,然后按字母数字对 csv 进行排序?基本上程序必须对其进行排序,而不是用户。

如果您也可以让我继续这样做,csv 也需要标题。

4

2 回答 2

1

只要您可以将所有数据都放入内存中,最好将其全部保存并在内存中对其进行排序,而不是将其写入文件。对文件中的数据进行排序的概念一般通过“读入内存,排序,再写回”来解决。

至于写一个 CSV 文件,其实并没有那么难。我喜欢使用 StringBuilder 为每一行添加每个字段,然后一旦我有一行,我就会将该行附加到文件中。对于标题,您可以在适当的情况下对它们进行硬编码,或者如果它是动态的,则从您拥有的任何来源获取它们。你不知道如何写入文件吗?我的猜测是 File.WriteAllText() 和 File.AppendText() 方法将是您所需要的。

只是一个一般提示,因为您问过,不是将项目添加到列表中,因为您最终会对它们进行排序,而是将它们添加到 SortedList 中,以便随时对它们进行排序。然后,当你完成后,你只需一次拿一个,它们就已经准备好了。

于 2012-01-30T18:02:44.587 回答
0

您可以使用 LINQ 进行排序,使用 aStreamWriter进行文件创建。

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 中文件名的有效字符,因此它不应该成为问题。

于 2012-01-30T18:23:00.010 回答