7

通过 NuGet 获得的https://joshclose.github.io/CsvHelper/用于读取和写入 CSV 文件。

CsvHelper 允许您将 CSV 文件直接读取到您的自定义类中。

如上一个问题所示

var streamReader = // Create a reader to your CSV file.
var csvReader = new CsvReader( streamReader );
List<MyCustomType> myData = csvReader.GetRecords<MyCustomType>();

CsvReader 将根据标题行自动计算出如何匹配属性名称(这是可配置的)。它使用编译的表达式树而不是反射,因此速度非常快。

它也是非常可扩展和可配置的。

我基本上是在尝试研究如何读取带有标题(未知名称)的 CSV 文件并将记录读入自定义对象。

根本没有这方面的文档,所以想知道是否有人知道如何使用 CsvReader 将值按顺序放入字符串数组中,或者您建议如何处理这个问题?

4

3 回答 3

9

这是我的第一个版本,我会在修改内容并使其更完整时进行更新,但这为我提供了字符串数组中的所有数据。

   [HttpPost]
        public ActionResult UploadFile(HttpPostedFileBase file)
        {

            ICsvParser csvParser = new CsvParser(new StreamReader(file.InputStream));
            CsvReader csvReader = new CsvReader(csvParser);
            string[] headers = {};
            List<string[]> rows = new List<string[]>();
            string[] row;
            while (csvReader.Read())
            {
                // Gets Headers if they exist
                if (csvReader.HasHeaderRecord && !headers.Any())
                {
                    headers = csvReader.FieldHeaders;
                }
                row = new string[headers.Count()];
                for (int j = 0; j < headers.Count(); j++)
                {
                    row[j] = csvReader.GetField(j);
                }
                rows.Add(row);
            }
            ImportViewModel model = new ImportViewModel(rows);
            return View(model);
        }
于 2011-05-05T22:20:06.087 回答
5

您可以在属性上放置一个CsvFieldAttribute,您可以在其中放置 csv 字段的名称或 csv 字段的索引。仅当 csv 文件中有标题行时,名称才有效。

public class MyCustomClass
{
    [CsvField( FieldIndex = 1 )]
    public string Property1 { get; set; }

    [CsvField( FieldIndex = 0 )]
    public string Property2 { get; set; }

    [CsvField( FieldIndex = 2 )]
    public string Property3 { get; set; }
}

如果您只想按照文件中的顺序将记录读入字符串数组,则可以使用CsvParser代替CsvReader. 调用CsvParser.Read()返回一个string[]. CsvReader用于CsvParser读取原始数据。

https://github.com/JoshClose/CsvHelper/wiki/Fluent-Class-Mapping

于 2011-04-02T05:06:15.460 回答
1

我知道这与 CVSHelpers 无关,但您可能想考虑FileHelpers项目

它允许您使用属性装饰对象上的字段,使其代表 csv 文件中的一行,然后使用 FileHelperEngine 读取文件 - 生成一个对象数组,每个对象代表一行

请参阅阅读分隔文件的快速入门

于 2011-03-31T08:12:30.093 回答