Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-02-2015
JuanOrtega JuanOrtega is offline
Miembro
NULL
 
Registrado: sep 2011
Posts: 130
Poder: 13
JuanOrtega Va por buen camino
Funcion para extraer texto de archivos de texto

Hola tengo el siguiente codigo :

Código Delphi [-]

function read_file(const FileName: String): AnsiString;
var
  Stream: TFileStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenRead);
  try
    SetLength(Result, Stream.Size);
    Stream.ReadBuffer(Pointer(Result)^, Stream.Size);
  finally
    Stream.Free;
  end;
end;

function cortar(archivo: String; deaca: String; hastaaca: String): String;
var text:string;
begin
  text := read_file(archivo);
  Delete(text, 1, AnsiPos(deaca, text) + Length(deaca) - 1);
  SetLength(text, AnsiPos(hastaaca, text) - 1);
  Result := text;
end;

function cut(archivo,Delimit1, Delimit2 :String) :String;
var
  Buffer      :AnsiString;
  ResLength   :Integer;
  i           :Integer;
  PosDelimit  :Integer;
begin
  Buffer := read_file(archivo);
  if Pos(Delimit1, Buffer) > Pos(Delimit2, Buffer) then
    PosDelimit := Length(Buffer)-(Pos(Delimit1, Buffer)+Length(Delimit1))
  else PosDelimit := Length(Buffer)-(Pos(Delimit2, Buffer)+Length(Delimit2));
  Buffer := Copy(Buffer, (Length(Buffer)-PosDelimit), Length(Buffer));
  ResLength := Pos(Delimit2, Buffer)-(Pos(Delimit1, Buffer)+Length(Delimit1));
  for i := 0 to (Reslength-1) do
    Result := Result+Buffer[Pos(Delimit1, Buffer)+(Length(Delimit1)+i)];
end;

Estoy tratando de mejorar mi funcion cortar() para que se parezca mas a la funcion cut() del codigo mostrado , lo que hacen es leer un archivo cualquiera y buscar en ellos texto que este entre dos etiquetas , el problema es que mi funcion cortar() me parece perfecta pero nunca obtengo el mismo resultado que la funcion cut() que parece mas compleja y no entiendo cual es el diferencia entre las dos porque cuando uso texto normal en un string las dos funciones son iguales pero cuando leo un archivo la funcion cut() es notablemente superior.

¿ como mejoro mi funcion cortar() para que haga lo mismo que cut() en los archivos ?
Responder Con Cita
  #2  
Antiguo 23-02-2015
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Cita:
la función cut() es notablemente superior
¿Qué quiere decir esto? Que es más rápida?

Cita:
¿ como mejoro mi función cortar() para que haga lo mismo que cut() en los archivos ?
¿Qué es lo que hace cut() que no hace cortar()?
Responder Con Cita
  #3  
Antiguo 23-02-2015
JuanOrtega JuanOrtega is offline
Miembro
NULL
 
Registrado: sep 2011
Posts: 130
Poder: 13
JuanOrtega Va por buen camino
La funcion cortar() y la funcion cut() hacen lo mismo buscar texto entre dos etiquetas en cualquier archivo ya sea de texto , el problema es que la funcion cut() lo encuentra todo por alguna razon que no entiendo porque la funcion cortar() a veces falla , por ejemplo busco el texto largo que esta entre etiquetas ej [hola]hola mundo[hola] y te devuelve hola mundo , eso pasa tambien en los archivos pero mi funcion cortar() a veces falla y la funcion cut() lo encuentra todo , espero haberme explicado.
Responder Con Cita
  #4  
Antiguo 23-02-2015
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Quizás es porque el fichero tiene caracteres raros en medio.
Puede que el fichero esté formado por caracteres Unicode de mas de un byte y por eso.

Ten en cuenta que read_file devuelve un tipo de dato AnsiString y tu lo cargas dentro de un string.
Dependiendo de la versión del Delphi, un string puede estar formado por caracteres de mas de un byte. El AnsiString solo contempla caracteres de un byte.
Código Delphi [-]
function read_file(const FileName: String): AnsiString;
...

function cortar(archivo: String; deaca: String; hastaaca: String): String;
var text:string;
begin
  text := read_file(archivo);

Si te fijas sobre el final de cut(), verás que hace una transformación de AnsiString a string;

Código Delphi [-]
  // Recorre un AnsiString carácter a carácter y lo concatena a un string.
  // AnsiString son caracteres de un byte.
  // string puede contener caracteres de mas de un byte
  for i := 0 to (Reslength-1) do
    Result := Result+Buffer[Pos(Delimit1, Buffer)+(Length(Delimit1)+i)];
Responder Con Cita
  #5  
Antiguo 23-02-2015
JuanOrtega JuanOrtega is offline
Miembro
NULL
 
Registrado: sep 2011
Posts: 130
Poder: 13
JuanOrtega Va por buen camino
Hola , gracias por la ayuda , parece que el problema es cuando lee archivos binarios con la funcion cortar() por eso no encuentra nada a pesar de que la funcion cut() si lo hace , estuve tratando de mejorar el codigo como hiciste pero me quedo esto :

Código Delphi [-]
function cortar(ruta, delimitador1, delimitador2: string): string;
var
  code: string;
  rta: string;
begin
  code := read_file(ruta);

  Delete(code, 1, AnsiPos(delimitador1, code) + Length(delimitador1) - 1);
  SetLength(code, AnsiPos(delimitador2, code) - 1);
  rta := code;

  if rta = '' then
  begin
    Result := 'Error';
  end
  else
  begin
    Result := rta;
  end;
end;

Probe cambiando los AnsiPos por Pos pero el programa se tilda completamente , tambien intente hacer la conversion que me recomendaste pero no se como relacionar ResLength con mi codigo.

¿ que tendria que hacer ?
Responder Con Cita
  #6  
Antiguo 24-02-2015
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Poder: 13
engranaje Va por buen camino
Habría que comprobar con los mismos ficheros que tú para estar seguro pero por probar he preparado algo asi en una unit y da la sensación de funcionar como se espera.

Código Delphi [-]
function LeeFichero(const fichero: String): AnsiString;
var
  F: file;
  cuantos: Integer;
  Buf: array[1..1024] of Char;
begin
  result := '';
  AssignFile(F, fichero);
  Reset(F, 1);

  repeat
    BlockRead(F, Buf, SizeOf(Buf), cuantos);
      result := result + Buf;
  until (cuantos = 0);

  CloseFile(F);
end;

function cortar(ruta, delimitador1, delimitador2: string): Ansistring;
begin
  result := LeeFichero(ruta);
  Delete(result, 1, AnsiPos(delimitador1, result) + Length(delimitador1) - 1);
  SetLength(result, AnsiPos(delimitador2, result) - 1);

  if result = '' then
    Result := 'Error';
end;
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Leer Archivos *.kar y desplegar su texto para Karaoke cacuna Varios 8 14-10-2010 15:34:04
¿Hay alguna función ya hecha para comprobar si un texto se puede convertir a número? noob Varios 7 05-12-2008 02:44:24
Wizard para importacion archivos texto GuerreroDelphi OOP 1 25-08-2008 16:25:49
Funciòn para extraer un campo texto zvf SQL 9 07-12-2007 22:32:03
Leer varios archivos de texto y extraer solo 2 lineas de ese texto mp3968 Internet 1 17-05-2007 21:24:09


La franja horaria es GMT +2. Ahora son las 20:58:59.


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
Copyright 1996-2007 Club Delphi