使用C#中的CSVHelper更改CSV文件中标题的名称

8

我正在使用CSV Helper库生成CSV文件,让用户填充并上传到系统中。我的问题是WriteHeader方法只写入类的属性,名称为"PropertyValue"之类的,这不太友好。是否有一种方法可以使生成的文本更加用户友好,但仍能成功映射类到文件数据?

我的代码如下:

public ActionResult UploadPropertyCSV(HttpPostedFileBase file)
    {
        List<PropertyModel> properties = new List<PropertyModel>();
        RIMEDb dbContext = new RIMEDb();
        bool success = false;
        foreach (string requestFiles in Request.Files)
        {
            if (file != null && file.ContentLength > 0 && file.FileName.EndsWith(".csv")) 
            {
                using(StreamReader str = new StreamReader(file.InputStream))
                {
                    using(CsvHelper.CsvReader theReader = new CsvHelper.CsvReader(str))
                    {
                        while (theReader.Read())
                        {
                            RIMUtil.PropertyUploadCSVRowHelper row = new RIMUtil.PropertyUploadCSVRowHelper()
                            {
                                UnitNumber = theReader.GetField(0),
                                StreetNumber = theReader.GetField(1),
                                StreetName = theReader.GetField(2),
                                AlternateAddress = theReader.GetField(3),
                                City = theReader.GetField(4)
                            };

                            Property property = new Property();
                            property.UnitNumber = row.UnitNumber;
                            property.StreetNumber = row.StreetNumber;
                            property.StreetName = row.StreetName;
                            property.AlternateAddress = row.AlternateAddress;
                            property.City = dbContext.PostalCodes.Where(p => p.PostalCode1 == row.PostalCode).FirstOrDefault().City;

                            dbContext.Properties.Add(property);
                            try
                            {
                                dbContext.SaveChanges();
                                success = true;
                            }
                            catch(System.Data.Entity.Validation.DbEntityValidationException ex)
                            {
                                success = false;
                                RIMUtil.LogError("Ptoblem validating fields in database. Please check your CSV file for errors.");
                            }
                            catch(Exception e)
                            {
                                RIMUtil.LogError("Error saving property to database. Please check your CSV file for errors.");
                            }
                        }
                    }
                }
            }
        }
        return Json(success);
    }

我想知道是否有一些元数据标签或其他东西,可以放在我的PropertyUploadCSVRowHelper类的每个属性上方,以便在文件中生成我所需的文本。

先行致谢。


你应该查看CsvHelper Mappings。这就是你在问题中所提到的内容。 - Nkosi
2个回答

13

不确定两年前是否存在,但现在我们可以使用以下属性函数来更改属性/列名称:

[CsvHelper.Configuration.Attributes.Name("Column/Field Name")] 

完整代码:

using CsvHelper;
using System.Collections.Generic;
using System.IO;

namespace Test
{
    class Program
    {
        class CsvColumns
        {
            private string column_01;

            [CsvHelper.Configuration.Attributes.Name("Column 01")] // changes header/column name Column_01 to Column 01
            public string Column_01 { get => column_01; set => column_01 = value; }
        }

        static void Main(string[] args)
        {
            List<CsvColumns> csvOutput = new List<CsvColumns>();
            CsvColumns rows = new CsvColumns();
            rows.Column_01 = "data1";
            csvOutput.Add(rows);

            string filename = "test.csv";
            using (StreamWriter writer = File.CreateText(filename))
            {
                CsvWriter csv = new CsvWriter(writer);
                csv.WriteRecords(csvOutput);
            }
        }
    }
}

1
这可能不能直接回答您的问题,因为您说您想使用csvhelper,但如果您只是编写小型文件(这是我用来生成csv的简单函数。请注意,csvhelper对于较大的文件会更好,因为它只是构建字符串而不是流式传输数据。

只需在下面的代码变量中自定义列数组以满足您的需求。

public string GetCsv(string[] columns, List<object[]> data)
{
    StringBuilder CsvData = new StringBuilder();

    //add column headers
    string[] s = new string[columns.Length];
    for (Int32 j = 0; j < columns.Length; j++)
    {
        s[j] = columns[j];
        if (s[j].Contains("\"")) //replace " with ""
            s[j].Replace("\"", "\"\"");
        if (s[j].Contains("\"") || s[j].Contains(" ")) //add "'s around any string with space or "
            s[j] = "\"" + s[j] + "\"";
    }
    CsvData.AppendLine(string.Join(",", s));

    //add rows
    foreach (var row in data)
    {
        for (int j = 0; j < columns.Length; j++)
        {
            s[j] = row[j] == null ? "" : row[j].ToString();
            if (s[j].Contains("\"")) //replace " with ""
                s[j].Replace("\"", "\"\"");
            if (s[j].Contains("\"") || s[j].Contains(" ")) //add "'s around any string with space or "
                s[j] = "\"" + s[j] + "\"";
        }
        CsvData.AppendLine(string.Join(",", s));
    }

    return CsvData.ToString();

}

以下是如何使用它的示例代码:https://dotnetfiddle.net/2WHf6o

祝好运。


1
我已经添加了代码更改以帮助解释我的问题。你的解决方案听起来不错,但我们需要使用CSVHelper库。你知道是否有一些元数据字段可以用来在写入类的每个属性的标题时生成差异文本吗? - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接