c # Чтение .csv из потока в классе обработчика - PullRequest
0 голосов
/ 05 июня 2019

Я использую AJAX File Uploader от Valum для загрузки файла csv. Код для его инициализации:

    $(document).ready(function () {          
        var uploader = new qq.FileUploader({
            element: document.getElementById('file-uploader'),
            // path to server-side upload script
            action: 'handlers/PhoneNumberListHandler.ashx',
            buttonTitle: 'Upload Document',
            buttonText: ' Upload',
            allowedExtensions: ['csv'],
            sizeLimit: 1024000, // max size 
        });
    });


<div id="file-uploader"></div>

В классе обработчика c # я написал следующий код:

    HttpRequest request = context.Request;
    byte[] buffer = new byte[request.ContentLength];
    Stream inputStream;
    string fileName;

    inputStream = request.InputStream;
    fileName = request["qqfile"];

    using (var reader = new StreamReader(inputStream))
    {
        while (!reader.EndOfStream)
        {
            var line = reader.ReadLine();
            var values = line.Split(';'); // gives some abstract characters
        }
    }

Мой CSV-файл содержит три столбца: «Телефон», «Имя», «Фамилия», где первый столбец является обязательным, а остальные необязательными.

Я застрял, потому что не могу прочитать файл .csv. Может кто-нибудь, пожалуйста, помогите мне и предложите, как я могу прочитать содержимое файла CSV из потока или есть ли другой способ сделать это? Я хочу извлечь содержимое CSV и сохранить каждую строку отдельно в таблице базы данных.

Обновление: Я внес изменения в сохранение CSV-файла, и теперь содержимое выглядит так:

PhoneNumber, FirstName, LastName

11111, Taj, Mahal

22222, Оберай,

33333,, Лейк Палас

44444 ,,

Изменен вышеуказанный код:

    using (var reader = new StreamReader(inputStream))
    {
        List<string> listA = new List<string>();            
        while (!reader.EndOfStream)
        {
            var line = reader.ReadLine();
            var values = line.Split(';');

            listA.Add(values[0]);               
        }
    }

Я хочу получить индивидуальное значение столбцов, и здесь я получаю полную строку в одной строке. Чтобы получить индивидуальное значение, мне нужно разделить его на «,» и получить значения. Я хочу знать, есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 05 июня 2019

Преобразование файла CSV в модель с отражением.Прежде всего вы можете создать модель и установить атрибуты с именем столбцов CSV.например:

     public class UserInfo
    {
        [CSVColumn(ImportName = "FirstName"]
        public string FirstName { get; set; }

        [CSVColumn(ImportName = "LastName"]
        public string LastName { get; set; }

        [CSVColumn(ImportName = "PhoneNumber"]
        public string PhoneNumber { get; set; }
    }

Другие шаги - чтение первой строки для получения данных о столбцах и на основе атрибутов свойств данных набора моделей из строки scv для каждого свойства модели:

     List<UserInfo> users = new List<UserInfo>();
     using (var reader = new StreamReader(inputStream))
            {
                //read first line with headers
                var metaDataLine = reader.ReadLine() ?? "";
                //get array with headers
                string[] csvMetada = metaDataLine.Split(',');  

                   while (!reader.EndOfStream)
                    { 
                     // create model based on string data and columns metadata with columns                      
                     UserInfo newModel =   ConvertCSVToEntity(reader.ReadLine() ?? "", csvMetada);
                     users.add(newModel);
                    }
                }

преобразованиестрока метода csv строка для модели:

        public UserInfo convertCSVToEntity(string line, string[] csvMetada)
        {
            var values = line.Split(',');

            UserInfo newRecord = ConvertorHelper.ConvertCSVToEntity<UserInfo>(values, csvMetada);

            return newRecord;
        }


        public static T ConvertCSVToEntity<T>(string[] csvData, string[] csvMetada) where T : new()
        {
            T returnEntity = new T();
            var properties = returnEntity.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);

            foreach (var eachProperty in properties)
            {
                var csvAttribute = eachProperty.GetCustomAttribute(typeof(CSVColumn)) as CSVColumn;
                if (csvAttribute != null)
                {
                    int csvIndex = Array.IndexOf(csvMetada, csvAttribute.ImportName);
                    if (csvIndex > -1)
                    {
                        var csvValue = csvData[csvIndex];

                        object setValue = null;
                        try
                        {
                            setValue = string.IsNullOrEmpty(csvValue) && eachProperty.PropertyType != typeof(string) ? Activator.CreateInstance(eachProperty.PropertyType) : Convert.ChangeType(csvValue, eachProperty.PropertyType, ParseCulture);
                        }
                        catch (Exception e)
                        {
                        }
                }
            }

            return returnEntity;
        }

Атрибуты класса

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]  



 public class CSVColumn : Attribute
    {
        public string ImportName { set; get; }

        public CSVColumn() { }

        public CSVColumn(string _import)
        {
            this.ImportName = _import;

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