使用csvhelper(nuGET)和C#MVC导入CSV文件

And*_*rew 7 csv import-from-csv asp.net-mvc-3 csvhelper

通过NuGet提供的http://csvhelper.com用于读取和写入CSV文件.

CsvHelper允许您直接将CSV文件读入自定义类.

如上一个问题所示

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

CsvReader将根据标题行自动确定如何匹配属性名称(这是可配置的).它使用编译的表达式树而不是反射,所以它非常快.

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

我基本上试图找出如何读取带有标题(未知名称)的CSV文件并将记录读入自定义对象.

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

And*_*rew 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);
        }
Run Code Online (Sandbox Code Playgroud)


Jos*_*ose 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; }
}
Run Code Online (Sandbox Code Playgroud)

如果您要做的只是按照文件中的顺序将记录读入字符串数组,则可以使用CsvParser而不是CsvReader.呼叫CsvParser.Read()返回a string[].CsvReader用于CsvParser读取原始数据.