c# - .NET 如何从匿名类型的枚举中输出 csv?

标签 c# .net csv anonymous-types filehelpers

使用 FileHelpers ,我用 [DelimitedRecord(",")] 装饰了一个类并打算将该类型的对象枚举输出为 CSV。但是,它没有用,因为我的类继承自 ActiveRecordLinqBase<T> , 这引起了一些问题。

所以,我想知道我是否可以只选择一个匿名类型的枚举,并以某种方式让 filehelpers 从中生成 csv。我不喜欢只为 FileHelpers 定义一个类来输出 csv。

我愿意使用另一个 csv 库,但 FileHelpers 已被证明。

编辑

@Foovanadil:这就是我想要做的事情:

CreateCSV(MyCollection.Select(x=>new{
    x.Prop1,
    x.Prop2,
    x.Prop3
}));

给你:

Prop1,Prop2,Prop3
val1a,val2a,val3a
val1b,val2b,val3b
etc.....

最佳答案

LINQ To CSV对我来说效果很好。

这是我如何使用它的示例:

protected void Page_Load(object sender, EventArgs e)
{
    var courseId = int.Parse(Request["id"]);
    var course = Course.Queryable.Single(x => x.Id == courseId);
    Response.ContentType = "text/csv";
    Response.AddHeader("Content-Disposition", string.Format("attachment;filename=\"{0}.csv\";", course.Code));

    var csvContext = new LINQtoCSV.CsvContext();
    var writer = new System.IO.StreamWriter(Response.OutputStream);
    csvContext.Write(course.Registrations.Select(x => new
    {
        x.StudentId,
        x.Name,
        x.EmailAddress,
        x.MoodleUsername,
        x.Age,
        x.Is65OrOlder,
        x.CertificationAndRank,
        x.Citizenship,
        x.DateOfBirth,
        x.DepartmentName,
        x.StationNumber,        
        x.EmploymentStatus,
        x.HighestEducationLevel
    }), writer);        

    writer.Dispose();
}

更新

上述方法有一些缺点:

  • csv 文件中的列顺序是不可预测的。它不遵循匿名类型中属性定义的顺序。
  • 列标题来自属性名称,但并不总是符合要求。

因此,我决定只为 CSV 记录创建一个类,这最终并没有比匿名类型做更多的工作。我用了Auto Mapper展平我的源类并填充 CSV 类的属性值。我也决定比较FileHelpersLinq To CSV . Linq To CSV在我的情况下是明显的赢家:

  • L2CSV 允许您将属性应用于类中的每个属性,以定义列顺序、列标题标题和转换格式。
  • FHs 只允许您为每个字段提供转换格式。列顺序取决于属性在类中定义的顺序。
  • FH 不会从属性名称中推断出列标题,也不会让您提供。您可以提供文字字符串作为 CSV 文件的 header ,但这并不好:分隔符内置于文字字符串中;列标题的顺序与属性的顺序不同步。

我希望这些发现有用。这是我的新代码:

// CSV Class

public class CsvRegistration
{
    [CsvColumn(FieldIndex = 0)]
    public string Name { get; set; }

    [CsvColumn(FieldIndex = 1, Name = "Student Id")]
    public int StudentId { get; set; }

    [CsvColumn(FieldIndex = 2, Name = "Email Address")]
    public string EmailAddress { get; set; }

    [CsvColumn(FieldIndex = 3, Name = "Moodle Username")]
    public string MoodleUsername { get; set; }

    [CsvColumn(FieldIndex = 4, Name = "Dept. Name")]
    public string DepartmentName { get; set; }

    [CsvColumn(FieldIndex = 5, Name = "Station #")]
    public string StationNumber { get; set; }

    [CsvColumn(FieldIndex = 6, Name = "Highest Education Level")]
    public string HighestEducationLevel { get; set; }

    [CsvColumn(FieldIndex = 7, Name = "Certification/Rank")]
    public string CertificationAndRank { get; set; }

    [CsvColumn(FieldIndex = 8, Name = "Employment Status")]
    public string EmploymentStatus { get; set; }

    [CsvColumn(FieldIndex = 9, Name = "Registration Date")]
    public DateTime RegistrationDate { get; set; }

    [CsvColumn(FieldIndex = 10, Name = "Date of Birth")]
    public DateTime DateOfBirth { get; set; }

    [CsvColumn(FieldIndex = 11)]
    public int Age { get; set; }

    [CsvColumn(FieldIndex = 12)]
    public string Citizenship { get; set; }

    [CsvColumn(FieldIndex = 13)]
    public string Race { get; set; }

    [CsvColumn(FieldIndex = 14)]
    public string Ethnicity { get; set; }

    [CsvColumn(FieldIndex = 15, Name = "Home Address")]
    public string HomeAddressLine1 { get; set; }

    [CsvColumn(FieldIndex = 16, Name = "City")]
    public string HomeAddressCity { get; set; }

    [CsvColumn(FieldIndex = 17, Name = "State")]
    public string HomeAddressState { get; set; }

    [CsvColumn(FieldIndex = 18, Name = "Zip")]
    public string HomeAddressZip { get; set; }

    [CsvColumn(FieldIndex = 19, Name = "County")]
    public string HomeAddressCounty { get; set; }

    [CsvColumn(FieldIndex = 20, Name = "Home Phone")]
    public string HomePhone { get; set; }

    [CsvColumn(FieldIndex = 21, Name = "Work Phone")]
    public string WorkPhone { get; set; }
}


// ASPX page to serve csv file

protected void Page_Load(object sender, EventArgs e)
{
    var courseId = int.Parse(Request["id"]);
    var course = Course.Queryable.Single(x => x.Id == courseId);
    Response.ContentType = "text/csv";
    Response.AddHeader("Content-Disposition", string.Format("attachment;filename=\"{0}.csv\";", course.Code));

    using (var writer = new System.IO.StreamWriter(Response.OutputStream))
    {
        var registrations = Mapper.Map<IEnumerable<Registration>, IEnumerable<CsvRegistration>>(course.Registrations);
        var cc = new LINQtoCSV.CsvContext();
        cc.Write(registrations, writer);
    }
}

关于c# - .NET 如何从匿名类型的枚举中输出 csv?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3001298/

相关文章:

c# - 在 DataGridView 中禁用编辑

c# - 访问 WPF 项目中的文本文件

c# - 在某个x坐标Unity旋转头像

c# - OpenBinaryDirect() 运行时异常 : This property cannot be set after writing has started

.net - 如何让企业库配置和项目设置设计器在app.config中引用相同的值

python - 如何在 Pandas 中的两列上使用聚合函数而不弄乱索引?

php - 忽略 MySQL PDO PHP 命令行中的 1 行不起作用

c# - 如何证明 .NET 类 Random 不适合生成密码?

c# - 使用 Func<T, string> 委托(delegate)列表对 IQueryable 执行 .Select()

java - 如何根据特定条件从文本文件中删除一行