Эффективное чтение файла 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; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д