Эффективное чтение файла CSV с обработкой ошибок - C#
Формулировка задачи:
Цель - прочитать данные из CSV-файла с дальнейшей обработкой полученных данных. Начал с использования StreamReader, не понравилось тем, что ловил ошибку периодически (уже не помню какую). Перешёл к использованию File.ReadAllLines - стал ловить другую ошибку, опять же, периодически. Не в отладчике, а уже при использовании приложения винда выдаёт такой текст при ошибке:
Не понимаю, дело в том, что не хватает оперативки или в чём-то другом? И вопрос, как всё же наиболее рационально читать большие CSV-шные файлы?
Подробная информация об использовании оперативной
(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 с обработкой ошибок»
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;
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д