MQLArticles/Utils/File.mqh

478 lines
28 KiB
MQL5

2025-09-22 09:08:13 -05:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| File.mqh |
//| Copyright 2025, Niquel Mendoza. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, Niquel Mendoza."
#property link "https://www.mql5.com/es/users/nique_372/news"
2026-03-08 19:11:59 -05:00
#property strict
#ifndef MQLARTICLES_UTILS_FILE_MQH
2025-09-22 09:08:13 -05:00
#define MQLARTICLES_UTILS_FILE_MQH
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
#include "Basic.mqh"
//+------------------------------------------------------------------+
//| Csv |
//+------------------------------------------------------------------+
string get_header(string _filename)
{
int _fh = FileOpen(_filename, FILE_ANSI | FILE_COMMON | FILE_CSV | FILE_READ, "\n");
string header = FileReadString(_fh);
FileClose(_fh);
return header;
}
2025-09-22 09:08:13 -05:00
//+------------------------------------------------------------------+
int numero_lineas_csv(string _filename)
{
int lineas = 0;
int _fh = FileOpen(_filename, FILE_ANSI | FILE_COMMON | FILE_CSV | FILE_READ, "\n");
while(!FileIsEnding(_fh))
{
FileReadString(_fh);
lineas++;
}
FileClose(_fh);
return lineas;
}
//+------------------------------------------------------------------+
int numero_columnas_csv(string _filename)
{
int _fh = FileOpen(_filename, FILE_ANSI | FILE_COMMON | FILE_CSV | FILE_READ, "\n");
string linea = FileReadString(_fh);
string columnas[];
StringSplit(linea, ',', columnas);
FileClose(_fh);
2025-09-22 09:08:13 -05:00
return ArraySize(columnas);
}
//+------------------------------------------------------------------+
//| Data del csv |
//+------------------------------------------------------------------+
2025-09-22 09:08:13 -05:00
string ExtractCSVColumn(string file_name, int col_index, ushort separator = ',')
{
string result = "";
string sym = ShortToString(separator);
// Abrir el archivo CSV en modo lectura
int handle = FileOpen(file_name, FILE_READ | FILE_CSV);
if(handle == INVALID_HANDLE)
{
2025-09-22 09:08:13 -05:00
Print(__FUNCTION__, "::Error al abrir el archivo: ", file_name);
return "";
}
// Leer el archivo l<EFBFBD>nea por l<EFBFBD>nea hasta el final
while(!FileIsEnding(handle))
{
string line = FileReadString(handle);
// Dividir la l<EFBFBD>nea por comas en un arreglo de strings
string columns[];
int count = StringSplit(line, separator, columns);
// Verificar que la columna deseada exista en esta l<EFBFBD>nea
if(count > col_index)
2025-09-22 09:08:13 -05:00
{
// Si ya hay contenido en 'result', se a<EFBFBD>ade una coma como separador
if(result != "")
result += sym;
result += columns[col_index];
}
}
FileClose(handle);
return result;
}
//+------------------------------------------------------------------+
2025-09-22 09:08:13 -05:00
struct file_data_csv
{
private:
2025-09-22 09:08:13 -05:00
string file_cabezera;
int file_handle;
string file_name;
2025-09-22 09:08:13 -05:00
bool create;
public:
void Create(string new_file_name, string cabezera, int open_flags = FILE_WRITE | FILE_CSV | FILE_COMMON)
{
this.file_name = new_file_name;
this.file_cabezera = cabezera;
this.file_handle = FileOpen(this.file_name, open_flags);
create = true;
if(this.file_handle == INVALID_HANDLE)
{
Print(__FUNCTION__"::Error al abrir el archivo: ", this.file_name, ", ultimo error: ", GetLastError());
}
FileWrite(this.file_handle, cabezera);
};
inline string GetFileName()
{
return this.file_name;
}
inline void Close()
{
FileClose(this.file_handle);
}
inline void Write(string text)
{
FileWrite(this.file_handle, text);
}
};
//+------------------------------------------------------------------+
void DeleteFileWithChecks(string fileName, int commonFlag = FILE_COMMON)
{
ResetLastError();
// Comprobar si el archivo existe en la ubicaci<EFBFBD>n especificada
if(FileIsExist(fileName, commonFlag))
{
// Intentar eliminar el archivo
if(FileDelete(fileName, commonFlag))
{
// Confirmaci<EFBFBD>n de que el archivo fue eliminado
Print("Archivo '", fileName, "' eliminado correctamente.");
2025-09-22 09:08:13 -05:00
}
else
{
// Informar del error al intentar eliminar el archivo
int errCode = GetLastError();
Print("Error al eliminar el archivo '", fileName, "'. C<00>digo de error: ", errCode);
}
}
else
{
// El archivo no existe, informar al usuario
Print("El archivo '", fileName, "' no existe en la ubicaci<00>n especificada.");
}
}
//+------------------------------------------------------------------+
void RenameFileWithChecks(const string oldFileName, int commonFlag, const string newFileName, int modeFlags)
{
// Comprobar si el archivo original existe
if(FileIsExist(oldFileName, commonFlag))
{
// Intentar cambiar el nombre del archivo
if(FileMove(oldFileName, commonFlag, newFileName, modeFlags))
{
2025-09-22 09:08:13 -05:00
// Confirmaci<EFBFBD>n de que el nombre del archivo fue cambiado
Print("El archivo '", oldFileName, "' ha sido renombrado a '", newFileName, "' correctamente.");
}
else
{
// Informar del error al intentar cambiar el nombre del archivo
int errCode = GetLastError();
2025-09-22 09:08:13 -05:00
Print("Error al cambiar el nombre del archivo de '", oldFileName, "' a '", newFileName, "'. C<00>digo de error: ", errCode);
2025-09-22 09:08:13 -05:00
}
}
else
2025-09-22 09:08:13 -05:00
{
// El archivo no existe, informar al usuario
2025-09-22 09:08:13 -05:00
Print("El archivo '", oldFileName, "' no existe en la ubicaci<00>n especificada.");
2025-09-22 09:08:13 -05:00
}
}
//+------------------------------------------------------------------+
2025-09-22 09:08:13 -05:00
struct Filas
{
string datos[];
2025-09-22 09:08:13 -05:00
};
2025-09-22 09:08:13 -05:00
//---
struct CSV
{
Filas data[];
};
//---
bool CSVToArray(const string &fileName, bool common_flag, CSV &file, ushort line_separator, uint code_page = CP_ACP)
{
// Limpia el array existente
ArrayResize(file.data, 0);
int flags = common_flag ? FILE_COMMON : 0;
// Verifica que el archivo exista
if(!FileIsExist(fileName, flags))
2026-03-08 19:11:59 -05:00
{
printf("%s:: El archivo %s no existe", __FUNCTION__, fileName);
2026-03-26 09:51:28 -05:00
2026-03-08 19:11:59 -05:00
return false; // Sale de la funci<EFBFBD>n si el archivo no existe
}
flags = !common_flag ? (FILE_READ | FILE_CSV) : (FILE_READ | FILE_CSV | FILE_COMMON);
2026-03-25 10:05:12 -05:00
2026-03-26 09:51:28 -05:00
ResetLastError();
// Abre el archivo en modo lectura
const int fileHandle = FileOpen(fileName, flags, "\n", code_page);
if(fileHandle == INVALID_HANDLE)
{
Print(__FUNCTION__, ":: Error al abrir el archivo: ", fileName, " | ultimo error: ", GetLastError());
2026-03-25 10:05:12 -05:00
return false; // Sale de la funci<EFBFBD>n si no se puede abrir el archivo
}
// Lee el archivo l<EFBFBD>nea por l<EFBFBD>nea
while(!FileIsEnding(fileHandle))
{
2026-03-08 19:11:59 -05:00
const string line = FileReadString(fileHandle);
if(StringLen(line) > 0)
{
ArrayResize(file.data, file.data.Size() + 1);
2026-03-09 16:12:41 -05:00
string linea[];
2026-03-08 19:11:59 -05:00
StringSplit(line, line_separator, linea);
2026-03-22 13:36:18 -05:00
ArrayResize(file.data[file.data.Size() - 1].datos, linea.Size());
for(int i = 0; i < ArraySize(linea) ; i++)
file.data[file.data.Size() - 1].datos[i] = linea[i];
2026-03-25 10:05:12 -05:00
}
2026-03-22 13:36:18 -05:00
2026-03-06 09:24:44 -05:00
}