Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Necesito ayuda con el manejo de archivos usando delphi 7 (https://www.clubdelphi.com/foros/showthread.php?t=58222)

mauser1985 12-07-2008 18:31:26

Necesito ayuda con el manejo de archivos usando delphi 7
 
Veran, estoy usando Dephi 7 y necesito ayuda con un programita que ando creando, la cuestion es la siguiente: necesito abrir el archivo desde la pc y leerlo por eso no hay problema la cuestion es que en el archivo que debo leer los datos aparecen de manera secuencial es decir aparecen varias lineas que no me interesan, el problema se me presenta porque la idea del programa es que me lea desde ciertos marcadores (en este caso se llaman *jhjjhb y *jbjb), y toda la informacion entre esos marcadores (sin incluir a los mismos) debe ir en un archivo creado desde delphi en un archivo nuevo con una extension especifica :confused:.
Ese procedimiento se repite varias veces a lo largo del archivo, para cada informacion de interes se debera crear un archivo especifico:D.
Si me pudieran ayudar con el codigo fuente de manera que me guie al hacer el proghrma se lo agradeceria mucho.
Si lo desean me puede escribir a mi mail mauricioa85@hotmail.com :cool:

coso 12-07-2008 19:11:56

Hola, seria algo asi...

Código Delphi [-]

void Comenzar()
{
       TStringList ls;
       int numeroarchivo;
       char *nombrearchivo = 'nombre';

       ls = TStringList.Crear(nulo);
       ls->CargarArchivo(nombrearchivo);

       for (unsigned char i;i <= ls.items.Count - 1;i++)
       {
            if (ls[i] = marcador_inicio)
            {
                TStringList ls_g = TStringList.Create(nill);

                while !(i>ls->items.Count || ls.[++i] = marcardor_fin)
                     ls_g.Add(ls[i]);                

                ls_g.GrabaraArchivo(nombre_archivo + astring(numeroarchivo) + ext);
                ls_g.Liberar;                      
                numeroarchivo++;
            }
       }
       ls.Liberar;
}
,
mas o menos, escribo de cabeza :rolleyes: saludos y espero que te sirva.

mauser1985 12-07-2008 22:44:21

Gracias
 
Gracias por la molestia pero no termino e entender lo que me respondiste, es decir en la parte visual pienso usar un edit un opendialog y los botones que hagan falta para cargar el archivo grabado en mi pc, no entiendo que variables declarar con el codigo que me diste y que elementos visuales deberia usar..

El rchivo de mi interes es algo asi...

****
****
*****
****
*Inicio
1 25 69,4 87,9
2 4,7 85 745,89
3 65,89 9,7 47,8
4 ......................
.
.
.
.
*fin
.
.
.
Como ya explique anteriormente necesito que la info entre (*iniio y *fin) sea grabada en otro archivo con una extension especifica en la cual vayan los valores port orden de numeros sin contar los primeros.
Gracias

coso 12-07-2008 22:55:44

elementos visuales en principio ninguno, de variables (importantes aparte del contador) dos stringlist, el nombre del archivo a cargar, el numero de archivo a grabar y un string temporal. Mira, te lo pongo en pseudocodigo

Código Delphi [-]
 
funcion Grabar
{
           ls     StringList // stringlist donde cargaremos el archivo a analizar
           ls_g  StringList // stringlist que usaremos para grabar los trozos
 
           ls := TStringList.Create
           ls_g := TStringList.Create
 
           ls.LoadFromFile(nombre_de_archivo); // cargamos archivo
 
           i = 0
           num_archivo = 0
 
           mientras i menor que ls.Numero_de_lineas haz
             si ls[i] = '*inicio' entonces
             {
                  num_archivo = num_archivo + 1
                  ls_g.Clear
                  s = ls[i]
                  mientras (s diferente de '*final') y (i menor que ls.Count) haz
                  {
                      ls_g.Add(ls[i]
                      i = i + 1
                      s = ls[i]
                  }
                  ls_g.SaveToFile(nombre_archivo + inttostr(num_archivo) + '.ext');
              }
              si no i = i + 1
 
            ls_g.Libera // liberamos los objetos TStringList creados
            ls.free      //
}

mauser1985 12-07-2008 23:38:35

Gracias
 
Ok Gracias me parece que ese codigo si me ayudara pero aun tengo unos problemas pues soy novato en delphi.
No entiendo la parte de num_de_lineas y nom_archivo??? los declaro como una variable??? use un opendialog para localizar el archivo y sacar su ubicacion y escribir esta ubicacion en un edit.
Gracias

coso 12-07-2008 23:41:30

num de lineas es el numero de lineas que hay en el stringlist (si miras la ayuda de delphi, buscando TStringList, la propiedad count) y si, num_archivo seria para dar un nombre diferente a cada bloque que grabas. Te recomiendo que repases el codigo y lo entiendas bien. saludos

Caro 13-07-2008 00:01:44

Hola mauser1985, para la parte del OpenDialog debes utilizar su propiedad FileName en el cual esta toda la ruta de tu archivo que has elegido y luego abrilo en el StringGrid.

Código Delphi [-]
var
  ls    : TStringList; // stringlist donde cargaremos el archivo a analizar
  ls_g : TStringList; // stringlist que usaremos para grabar los trozos
  FileName : String;
begin
  ls := TStringList.Create
  ls_g := TStringList.Create
  if OpenDialog.Execute then
   begin
     FileName := OpenDialog.FileName;
 
     ls.LoadFromFile(FileName); // cargamos archivo
     
     .........................
     .........................
   end;

Saluditos

Caro 13-07-2008 00:49:56

Hola de nuevo, también lo puedes hacer de esta forma, no lo estoy escribiendo de cabeza pero si de memoria.

Código Delphi [-]
var
  slFile    : TStringList; // stringlist donde cargaremos el archivo a analizar
  slFileNuevo  : TStringList; // stringlist que usaremos para grabar los trozos
  FileName   : String;
  NumeroFile : Integer; 
  flgInicio, flgFin : Boolean; //Banderitas que nos serviran para saber cuando tenemos un inicio o fin
begin
  slFile := TStringList.Create;
  slFileNuevo := TStringList.Create;
  if OpenDialog.Execute then
   begin
     FileName := OpenDialog.FileName;
 
     slFile.LoadFromFile(FileName); // cargamos archivo
     
     flgInicio := False;
     flgFin := False;
     NumeroFile := 1;
 
     for i:=0 to slFile.Count-1 do
      begin
        if slFile[i]='*Inicio' then
          flgInicio := True;
 
        if (slFile[i]='*Fin' then
          flgFin := True;  
        
        if (flgInicio=True) and (flgFin=False) then //esto lo puedes simplificar, pero es solo para que se entienda
         slFileNuevo.Add(slFile[i+1]); //añadimos en el nuevo
 
        if  flgFin=True then //grabamos en el archivo
         begin
            slFileNuevo.SaveToFile('NombreArchivo'+NumeroFile+'.txt');
            flgInicio := False;
            flgFin := False;
            Inc(NumeroFile); 
         end;//if
      end;//for
      .................
      .................         
   end;

Saluditos

mauser1985 13-07-2008 02:57:43

Gracias
 
Hola Caro de verdad que muchas gracias, con ese codigo me ayudare para terminar el programa aunque debo descifrar aun como hacer para que la primera columna de numeros no me aparesca y aun no veo el porque el ultimo marcdor (*final) aun me aparece en el archivo final

coso 13-07-2008 10:30:21

Hola, siguiendo el codigo de Caro, el ultimo marcador te aparece porque el string que comparas es el slFile[i], mientras que el que añades es slFile[i+1]. Esta solución es buena para evitar incluir el slFile[n] = '*inicio', pero falla en la otra. Una manera de corregirlo seria continuando el loop si se encuentra algun marcador...
Código Delphi [-]
        ....
        if slFile[i]='*Inicio' then 
        begin
          flgInicio := True;
          continue;
        end;
 
        if (slFile[i]='*Fin' then
        begin
          flgFin := True;   
          continue;
        end;
        
        if (flgInicio=True) and (flgFin=False) then //esto lo puedes simplificar, pero es solo para que se entienda
         slFileNuevo.Add(slFile[i]); //añadimos en el nuevo
        ...
saludos.

coso 13-07-2008 10:44:29

lo de la primera columna puedes solucionarlo haciendo

Código Delphi [-]
 if (flgInicio=True) and (flgFin=False) then //esto lo puedes simplificar, pero es solo para que se entienda
         slFileNuevo.Add(TrimLeft(StrScan(slFile[i],' '))); //añadimos en el nuevo

si miras la ayuda de delphi, te dira que strscan te devuelve una subcadena desde una cadena a partir de encontrar un carácter (en este caso, ' '). Como incluye el carácter donde se empieza, usamos TrimLeft que elimina los espacios iniciales.

saludos, y a ver si te sirve :D

PD : una curiosidad, ese archivo parece de coordenadas. Para q servirá la aplicación? :?

mauser1985 13-07-2008 14:27:26

Hola
 
Bueno dejame chequear a ver si el programa me hace lo que espero, la aplicacion tiene el siguiente objetivo; para el uso de un programa de pre y postproceso de simulacion en aplicaciones de problemas cientificos y de ingenieria, bueno pues dicho programa necesita ciertos archivos para cargar la geometria y condiciones de un solido.
Necesito abrir leer datos y apartir de ahi, expulsar diferentes archivos desde un unico archivo que es el output de abaqus..

mauser1985 13-07-2008 14:38:47

Buenas
 
Aja y que caracter debo colocar en ' '??? es que compilo y me dice que hay un error de incompatibilidades entre un sring y PAnsiChar

coso 13-07-2008 14:56:04

como te dije, pegale un repasillo a la ayuda de delphi de strscan :) saludos

mauser1985 13-07-2008 21:52:59

Una pregunta
 
Resulta que ya ando probando la interface final pero no se donde me guarda el archivo final y es extraño porque lo pruebo cargando y leyendo otros archivos y siempre me lo guarda en Mis Documentos y esta vez no se si me los lee o no, pienso que quizas es porque los datos son numeros reales, y estoy usando un stringlist pero de verdad que no se; les agradeceria si me ayudaran.

coso 13-07-2008 22:04:56

los datos son numeros reales, pero estan tratados como texto, por lo que no hay problema de usar un stringlist. En cuanto a la localización del archivo, es probable que no le hayas asignado ninguna ruta ('c:\carpeta\nombrearchivo.txt') , solo el nombre, en el momento de grabarlo (lo mas seguro que este en el mismo directorio que el ejecutable)

mauser1985 13-07-2008 22:16:14

Sr Coso no se encuentra ni en la carpeta donde esta el ejecutable ni en Mis Documentos como cuando hacia las otras pruebas

coso 13-07-2008 22:17:46

bueno, y si hace una busqueda del archivo, en que localizacion se encuentra?

mauser1985 13-07-2008 22:21:20

Tamp'oco Sr Coso, realizo una busqueda con el nombre del archivo en toda la pc y no aparece; es extraño porque pruebo ese mismo codigo con otro archivo y si me graba perfectamente en mis documentos, cuando hago al prueba con el archivo de interes no pasa nada es como si nisiquiera lo leyera

mauser1985 13-07-2008 22:28:30

Bueno ahora me aparece una excepcion me dice: ESTRinglist error with mesage 'List Index out of bounds (30069)'.... Me parece que el string list no tiene suficientes caracteres para abarcar todo el archivo, me equivoco??


La franja horaria es GMT +2. Ahora son las 10:35:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi