utiles_v2017/csv_file.cpp

309 lines
6.9 KiB
C++
Raw Permalink Blame History

#include "StdAfx.h"
#include "csv_file.h"
#include "_error.h"
//*********************************************************************************************************
Ccsv_file::Ccsv_file( C_error* err/*=NULL*/ )
{
if (err)
{
b_er=FALSE;
er=err;
}
else
{
er= new C_error();
b_er=TRUE;
}
filas.z=sizeof(Fila_csv_file);
filas.incremento=100;
incre_col=100;
}
//*********************************************************************************************************
Ccsv_file::~Ccsv_file(void)
{
if(b_er && er)
delete er;
borra();
}
//*********************************************************************************************************
Fila_csv_file* Ccsv_file::get_f( int i )
{
return (Fila_csv_file*)filas.get(i);
}
//*********************************************************************************************************
char* Ccsv_file::get( int fila,int col )
{
Fila_csv_file*f;
Columna_csv_file *c;
f=get_f(fila);
if (!f)
return NULL;
c=f->get(col);
if (!c)
return NULL;
return str.get(c->itex);
}
//*********************************************************************************************************
int Ccsv_file::n_col( int fil )
{
Fila_csv_file*f;
f=get_f(fil);
if (!f)
return -1;
return f->colum->n;
}
//*********************************************************************************************************
int Ccsv_file::n()
{
return filas.n;
}
//*********************************************************************************************************
int Ccsv_file::add()
{
Fila_csv_file*f;
filas.reserva();
filas.n++;
f=get_f(filas.n-1);
f->inicia(incre_col);
f->flags=0;
return filas.n-1;
}
//*********************************************************************************************************
int Ccsv_file::add( int fila, char *valor )
{
Fila_csv_file*f;
Columna_csv_file *c;
f=get_f(fila);
if (!f)
return -1;
c=f->add_coun();
str.add(valor);
c->itex=str.size()-1;
return f->colum->n-1;
}
//*********************************************************************************************************
int Ccsv_file::add( int fila, int valor )
{
char s[64];
sprintf(s,"%ld",valor);
return add(fila,s);
}
//*********************************************************************************************************
int Ccsv_file::add( int fila, double valor )
{
char s[128];
sprintf(s,"%ld",valor);
return add(fila,s);
}
//*********************************************************************************************************
BOOL Ccsv_file::set( int fila, int col, char* value )
{
Fila_csv_file*f;
Columna_csv_file *c;
f=get_f(fila);
if (!f)
return FALSE;
c= f->get(col);
if(!c)
return FALSE;
c->itex=str.size();
str.add(value);
return TRUE;
}
//*********************************************************************************************************
BOOL Ccsv_file::set( int fila, int col, int value )
{
char s[64];
sprintf(s,"%ld",value);
return set(fila,col,s);
}
//*********************************************************************************************************
BOOL Ccsv_file::set( int fila, int col, double value )
{
char s[128];
sprintf(s,"%ld",value);
return set(fila,col,s);
}
//*********************************************************************************************************
void Ccsv_file::borra()
{
Fila_csv_file*f;
for(int i=0; i<filas.n;i++)
{
f=get_f(i);
f->del();
}
filas.borra();
}
//*********************************************************************************************************
BOOL Ccsv_file::lee( char *path,char separa )
{
char *buf=NULL;
char *s1;
char *s2;
char *s3;
int fi;
borra();
HANDLE hfile=INVALID_HANDLE_VALUE;
DWORD dw,nb;
//abrimos archivo---------------------
hfile = CreateFile(path, GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hfile == INVALID_HANDLE_VALUE)
{
er->pon_win(MODULO_CSV_FILE);
return FALSE;
}
nb=SetFilePointer(hfile,0,NULL,FILE_END);
if(nb==INVALID_SET_FILE_POINTER)
{
er->pon_win(MODULO_CSV_FILE);
goto salgo;
}
buf=(char *)malloc(nb+2);
dw=SetFilePointer(hfile,0,NULL,FILE_BEGIN);
if(dw==INVALID_SET_FILE_POINTER)
{
er->pon_win(MODULO_CSV_FILE);
goto salgo;
}
if (!ReadFile(hfile, (LPSTR) buf ,nb,&dw,NULL))
{
er->pon_win(MODULO_CSV_FILE);
goto salgo;
}
CloseHandle(hfile);
hfile=INVALID_HANDLE_VALUE;
buf[nb]=0;
buf[nb+1]=0;//aseguramos el final de la cadena;
s1=buf;
//procesamos--------------------------------------------------
while (*s1)
{
s2=busca_salto_linea(s1);
if (*s2)
{
*s2=0;
s2++;
while(*s2=='\r' ||*s2=='\n')
s2=s2+1;
}
//a<>adimos fila------------------------------------------
fi=add();
s3=s1;
while(*s3)
{
if (*s3==separa)
{
*s3=0;
//a<>adimos columna----------------------------------
add(fi,s1);
s1=s3+1;
}
s3=s3+1;
}
s1=s2;
}
free(buf);
return TRUE;
salgo:
if (hfile!=INVALID_HANDLE_VALUE)
CloseHandle(hfile);
if (buf)
free(buf);
return FALSE;
}
//*********************************************************************************************************
BOOL Ccsv_file::guarda( char *path, char separa, BOOL ret_carro )
{
HANDLE hfile=INVALID_HANDLE_VALUE;
DWORD dw;
char salto='\n';
char ret_ca='\r';
Fila_csv_file*f;
Columna_csv_file *c;
char*st;
/*
er->pon(MODULO_INI_FILE,"guarda: Funci<63>n no implementada");
return FALSE;*/
//abrimos archivo-------------------------------
hfile=CreateFile(path,
GENERIC_WRITE,
0, // exclusive access
NULL, // no security
CREATE_ALWAYS,
0, // no overlapped I/O
NULL); // null template
if (hfile == INVALID_HANDLE_VALUE)
{
er->pon_win(MODULO_CSV_FILE);
return FALSE;
}
//guardamos---------------------------------
for (int i=0; i<filas.n; i++)
{
f=get_f(i);
if (f)
{
//guardamos columnas----------------
for (int j=0; j<f->colum->n;j++)
{
c=f->get(j);
st=str.get(c->itex);
if (j!=0)
{
//ponemos separacion--------
if(!WriteFile(hfile, &separa, 1, &dw, NULL))
{
er->pon_win(MODULO_CSV_FILE);
goto salgo;
}
}
if(!WriteFile(hfile, st, sizeof(st), &dw, NULL))
{
er->pon_win(MODULO_CSV_FILE);
goto salgo;
}
}
if (ret_carro)
{
if(!WriteFile(hfile, &ret_ca, 1, &dw, NULL))
{
er->pon_win(MODULO_CSV_FILE);
goto salgo;
}
}
if(!WriteFile(hfile, &salto, 1, &dw, NULL))
{
er->pon_win(MODULO_CSV_FILE);
goto salgo;
}
}
}
//cerramos----------------------------------
if(hfile!=INVALID_HANDLE_VALUE)
{
CloseHandle(hfile);
}
return TRUE;
salgo:
if(hfile!=INVALID_HANDLE_VALUE)
CloseHandle(hfile);
return FALSE;
}
//*********************************************************************************************************
char* Ccsv_file::busca_salto_linea( char* st )
{
char *s=st;
while(*s && *s!='\r' && *s!='\n' )
s=s+1;
return s;
}
//*************************************************************************************************