Эффективное чтение файла CSV с обработкой ошибок - C#

Узнай цену своей работы

Формулировка задачи:

Цель - прочитать данные из CSV-файла с дальнейшей обработкой полученных данных. Начал с использования StreamReader, не понравилось тем, что ловил ошибку периодически (уже не помню какую). Перешёл к использованию File.ReadAllLines - стал ловить другую ошибку, опять же, периодически. Не в отладчике, а уже при использовании приложения винда выдаёт такой текст при ошибке:
Подробная информация об использовании оперативной (JIT) отладки вместо данного диалогового окна содержится в конце этого сообщения. ************** Текст исключения ************** System.IO.IOException: Не удается прочитать данные из транспортного соединения: Удаленный хост принудительно разорвал существующее подключение. ---> System.Net.Sockets.SocketException: Удаленный хост принудительно разорвал существующее подключение в System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) --- Конец трассировки внутреннего стека исключений --- в System.Net.ConnectStream.Read(Byte[] buffer, Int32 offset, Int32 size) в System.IO.StreamReader.ReadBuffer() в System.IO.StreamReader.ReadToEnd() ...
Не понимаю, дело в том, что не хватает оперативки или в чём-то другом? И вопрос, как всё же наиболее рационально читать большие CSV-шные файлы?

Решение задачи: «Эффективное чтение файла CSV с обработкой ошибок»

textual
Листинг программы
   public static Boolean GetFromPostMethod(string Url, string Data)
        {
            PostQueryAnswer = string.Empty;
            PostQueryErr = string.Empty;
            var response = POST_Query(Url, Data);
 
            if (response != null)
                {
                    var strreader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
                    PostQueryAnswer = strreader.ReadToEnd();
                    return true;
                }
            else
                // что-то пошло не так, НЕУДАЧНЫЙ пост-запрос вернул ответ
                // Возвращая FALSE - мы говорим ПОВТОРИТЬ ЗАПРОС
                // TRUE - соглашаемся с тем, что запрос прошёл успешно
                {
                    switch (PostQueryErr)
                    {
                        case "Время ожидания операции истекло":
                            PostQueryErr = string.Empty;
                            return false;                        
                        case "Базовое соединение закрыто: Соединение, которое должно было работать, было разорвано сервером.":
                            goto case "Время ожидания операции истекло";
                        case "Запрос был прерван: Время ожидания операции истекло.":
                            goto case "Время ожидания операции истекло";
                            
                            // получили некую информацию, почему не прокатил запрос
                        default:
                            return true;
                    }
                }         
        }
 
   public static HttpWebResponse POST_Query(string Url, string Data)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
            request.Method = "POST";
            request.Proxy = null;
            request.Timeout = 2500;
            request.Credentials = CredentialCache.DefaultCredentials;
 
            UTF8Encoding encoding = new UTF8Encoding();
            var bytes = encoding.GetBytes(Data);
 
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = bytes.Length;
 
            try
            {
                using (var newStream = request.GetRequestStream())
                {
                    newStream.Write(bytes, 0, bytes.Length);
                    newStream.Close();
                }
                try
                {
                    return (HttpWebResponse)request.GetResponse();
                }
                catch (WebException wex)
                {
                    if (wex.Response == null)
                    {
                        PostQueryErr = wex.Message;
                    }
                    else
                    {
                        // Ответ от сервера в случае неудачного пост-запроса
                        try
                        {
                            var resp = new StreamReader(wex.Response.GetResponseStream()).ReadToEnd();
                            XmlDocument doc = new XmlDocument();
                            doc.LoadXml(resp);
                            XmlNodeList tegN = doc.GetElementsByTagName("body");
                            PostQueryErr = tegN[0].InnerText.Replace("\r", "").Replace("\n", "").Replace("\t", "");
                        }
                        catch
                        {
                            PostQueryErr = wex.Message;
                        }
                    }
                    return null;
                }
            }
            catch (Exception ex)
            {
                string xxx = ex.Message;
                return null;
            }
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5