using csvhelper (nuGET) with C# MVC to import CSV files

帅比萌擦擦* 提交于 2019-12-03 20:07:08

问题


http://csvhelper.com available via NuGet is used to read and write CSV files.

CsvHelper allows you to read your CSV file directly into your custom class.

As following was shown in a previous question

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

CsvReader will automatically figure out how to match the property names based on the header row (this is configurable). It uses compiled expression trees instead of reflection, so it's very fast.

It is also very extensible and configurable.

I'm basically trying to work out how to read in a CSV file with headers (unknown names) and read the records into a custom object.

There is no documentation on this at all so wondered if anyone knew how to use CsvReader to put the values in order into an array of strings or how would you recommend dealing with this?


回答1:


This is my first version, I will update as I amend things and make it more complete but this gives me all the data in string arrays.

   [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);
        }



回答2:


There is a CsvFieldAttribute that you can put on your property where you can either put the name of csv field, or the index of the csv field. Name will only work if there is a header row in the csv file.

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; }
}

If all you want to do is read a record into a string array in the order that it's in in the file, you can just use CsvParser instead of CsvReader. Calling CsvParser.Read() returns a string[]. CsvReader uses CsvParser to read the raw data.




回答3:


I know this is not related to CVSHelpers but you may like to consider the FileHelpers project

It allows you to decorate fields on an object with attributes so that it represents a row in the csv file and then use a FileHelperEngine to read the file in - resulting in an array of objects each one representing a row

see this quick start on reading delimited files



来源:https://stackoverflow.com/questions/5496845/using-csvhelper-nuget-with-c-sharp-mvc-to-import-csv-files

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!