【问题标题】:Iterate a File System and write results to CSV file迭代文件系统并将结果写入 CSV 文件
【发布时间】:2012-02-22 12:21:29
【问题描述】:

我正在编写一个迭代文件树的程序,现在我需要它来将结果写入 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; }

}

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

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

如果你也可以让我继续,csv 也需要标题。

【问题讨论】:

  • fileList.OrderByDescending(f => f.fileName);
  • 你也可以var csv = string.Join(",", fileList.OrderByDescending(f => f.fileName));
  • 您在编写 CSV 文件时遇到了什么问题?你试过什么?
  • @JohnSaunders 我以前从未这样做过。我查看了一些示例,似乎他们向 csv 写入了一个通用列表,而我正在努力编写我的列表,而不是编写到示例中的通用列表。
  • 向我们展示您尝试过的内容以及无效的内容。我们将帮助您使其正常工作。否则,这相当于我们为您工作。

标签: c# csv iteration loops export-to-csv


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您可以使用 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 中文件名的有效字符,因此这应该不是问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-24
      • 2019-05-07
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 2016-01-26
      相关资源
      最近更新 更多