использование csvhelper (nuGET) с C # MVC для импорта файлов CSV - PullRequest
7 голосов
/ 31 марта 2011

http://csvhelper.com, доступный через NuGet, используется для чтения и записи файлов 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 для упорядочения значений в массивестроки или как бы вы порекомендовали иметь дело с этим?

Ответы [ 3 ]

9 голосов
/ 06 мая 2011

Это моя первая версия, я буду обновлять ее по мере внесения поправок и делать ее более полной, но это даст мне все данные в строковых массивах.

   [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);
        }
5 голосов
/ 02 апреля 2011

Существует 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 для чтения необработанных данных.

1 голос
/ 31 марта 2011

Я знаю, что это не относится к CVSHelpers, но вы можете рассмотреть проект FileHelpers

Он позволяет вам украшать поля объекта с атрибутами, чтобы он представлял строку в файле csv, а затем использовать FileHelperEngine для чтения файла - в результате получается массив объектов, каждый из которых представляет строку

см. быстрый старт при чтении файлов с разделителями

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...