Эффективное чтение файла 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;
}
}