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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-12-2007
mcalmanovici mcalmanovici is offline
Miembro
 
Registrado: Jun 2006
Posts: 78
Poder: 11
mcalmanovici Va por buen camino
Leer una cierta cantidad de caracteres de una archivo.

Hola gente:
por empezar se agradece que estén leyendo este hilo y cualquier repuesta.
Supongo que lo que tengo que hacer no es muy dificil pero estoy buscando y realmente no encuentro nada.
La cosa es así: necesito leer un archivo pero de a 160 caracteres.
Tengo un archivo .dat en el cual cada registro que tengo que leer tiene 160 caracteres y dentro de esos registros cada campo tiene una longitud en particular.
Yo lo que necesito saber es como hago para leer los primeros 160 caracteres del archivo (dentro de esto los 2 primeros caracteres, después los 2 siguiente y sucesivamente), después los otros 160 caracteres del archivo, y así sucesivamente hasta el final.
Estaría agradecido si alguien me puede brindar alguna función o tipo de código en donde se abra un archivo y se lea de la manera que se necesito.

Espero haberme expresado bien.
Otra vez gracias.
Mariano.
Responder Con Cita
  #2  
Antiguo 18-12-2007
Avatar de juanlaplata
juanlaplata juanlaplata is offline
Miembro
 
Registrado: Jan 2007
Ubicación: La Plata, Bs. As. (Argentina)
Posts: 212
Poder: 11
juanlaplata Va por buen camino
Código:
public
    { Public declarations }
  strlist : TStringList;

procedure TForm1.FormCreate(Sender: TObject);
begin
Strlist:= TStringList.Create;
end;

procedure TForm1.Abrir1Click(Sender: TObject);
begin
if (opendialog1.Execute) then
   begin
   strlist.LoadFromFile(opendialog1.FileName);
   end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
strlist.Free;
end;

procedure TForm1.actualizarStringGrid;
var I:integer;
      temp: string;
begin
for I:=1 to StringGrid1.RowCount do
     StringGrid1.Rows[i].clear;
     for I:= 0 to (strlist.count)-1  do
                    begin
          temp:= strlist.Strings[i];// Aca serian los primero 160 caracteres
          StringGrid1.Cells[0,I+1]:=  copy(temp,1,8); // en cada una de estas filas copias la parte que quieras de los 160
          StringGrid1.Cells[1,I+1]:=  copy(temp,9,8);
          StringGrid1.Cells[2,I+1]:=  copy(temp,17,4);
                    StringGrid1.Cells[3,I+1]:=  copy(temp,21,1);
          StringGrid1.Cells[4,I+1]:=  copy(temp,22,10);
          ......

          StringGrid1.RowCount:=StringGrid1.RowCount+1;
          end;
end;

Última edición por juanlaplata fecha: 18-12-2007 a las 16:09:07.
Responder Con Cita
  #3  
Antiguo 18-12-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: May 2003
Ubicación: Campeche, México
Posts: 2.694
Poder: 16
maeyanes Va por buen camino
Hola...

El archivo está en formato de texto plano? Por que si es así, la solución que te da juanlaplata te puede servir, de otra forma, tendrías que usar otro método...


Saludos...
Responder Con Cita
  #4  
Antiguo 19-12-2007
mcalmanovici mcalmanovici is offline
Miembro
 
Registrado: Jun 2006
Posts: 78
Poder: 11
mcalmanovici Va por buen camino
Solución

Cita:
Empezado por maeyanes Ver Mensaje
Hola...

El archivo está en formato de texto plano? Por que si es así, la solución que te da juanlaplata te puede servir, de otra forma, tendrías que usar otro método...


Saludos...
Muchas gracias por sus respuestas y su tiempo. Al final lo hice de esta manera:
Código:
function TForm1.insertarRegistrosEnTAP2_CDRs(SRuta: String; id_archivo: integer; OraConn:TADOConnection): integer;
var
  Arch: TextFile;
  rsResultCDRs:TADOQuery;
  ArchivoEntero, insertCDR, Registro, Campo1, Campo2, Campo3, Campo4, Campo5, Campo6, Campo7, Campo8, Campo9, Campo10, Campo11, Campo12, Campo13, Campo14, Campo15,
  Campo16, Campo17, Campo18, Campo19, Campo20, Campo21, Campo22, Campo23, Campo24, Campo25, Campo26, Campo27, Campo28, Campo29, Campo30,
  Campo31, Campo32: String;
  i,cnt: integer;
  Seguir: Boolean;
begin
  cnt := 0;
  Campo1 := '0';
  AssignFile(Arch,SRuta);
  Reset(Arch);
  i := 1;
  readln(Arch,ArchivoEntero);
  Seguir := True;
  while Seguir do
  begin
    Registro := Copy(ArchivoEntero,i,160);
    Campo1 := Copy(Registro,1,2);
    if (Campo1 = '90') then
      Seguir := False
    else
    begin
      if ((Campo1 = '20') or (Campo1 = '30') or (Campo1 = '40')) then
      begin
        rsResultCDRs:=TADOQuery.Create(nil);
        rsResultCDRs.Connection:=OraConn;
        Campo2 := Copy(Registro,3,6);
        if Campo2 = '' then
          Campo2 := '''';
        Campo3 := Copy(Registro,9,1);
        if Campo3 = '' then
          Campo3 := '''';
        Campo4 := Copy(Registro,10,15);
        if Campo4 = '' then
          Campo4 := '''';
        Campo5 := Copy(Registro,25,16);
        if Campo5 = '' then
          Campo5 := '''';
        Campo6 := Copy(Registro,41,1);
        if Campo6 = '' then
          Campo6 := '''';
        Campo7 := Copy(Registro,42,1);
        if Campo7 = '' then
          Campo7 := '''';
        Campo8 := Copy(Registro,43,1);
        if Campo8 = '' then
          Campo8 := '''';
        Campo9 := Copy(Registro,44,21);
        if Campo9 = '' then
          Campo9 := '''';
        Campo10 := Copy(Registro,65,1);
        if Campo10 = '' then
          Campo10 := '''';
        Campo11 := Copy(Registro,66,2);
        if Campo11 = '' then
          Campo11 := '''';
        Campo12 := Copy(Registro,68,1);
        if Campo12 = '' then
          Campo12 := '''';
        Campo13 := Copy(Registro,69,2);
        if Campo13 = '' then
          Campo13 := '''';
        Campo14 := Copy(Registro,71,1);
        if Campo14 = '' then
          Campo14 := '''';
        Campo15 := Copy(Registro,72,1);
        if Campo15 = '' then
          Campo15 := '''';
        Campo16 := Copy(Registro,73,1);
        if Campo16 = '' then
          Campo16 := '''';
        Campo17 := Copy(Registro,74,15);
        if Campo17 = '' then
          Campo17 := '''';
        Campo18 := Copy(Registro,89,15);
        if Campo18 = '' then
          Campo18 := '''';
        Campo19 := Copy(Registro,104,5);
        if Campo19 = '' then
          Campo19 := '''';
        Campo20 := Copy(Registro,109,5);
        if Campo20 = '' then
          Campo20 := '''';
        Campo21 := Copy(Registro,114,1);
        if Campo21 = '' then
          Campo21 := '''';
        Campo22 := Copy(Registro,115,6);
        if Campo22 = '' then
          Campo22 := '''';
        Campo23 := Copy(Registro,121,6);
        if Campo23 = '' then
          Campo23 := '''';
        Campo24 := Copy(Registro,127,1);
        if Campo24 = '' then
          Campo24 := '''';
        Campo25 := Copy(Registro,128,6);
        if Campo25 = '' then
          Campo25 := '''';
        Campo26 := Copy(Registro,134,6);
        if Campo26 = '' then
          Campo26 := '''';
        Campo27 := Copy(Registro,140,9);
        if Campo27 = '' then
          Campo27 := '''';
        Campo28 := Copy(Registro,149,1);
        if Campo28 = '' then
          Campo28 := '''';
        Campo29 := Copy(Registro,150,1);
        if Campo29 = '' then
          Campo29 := '''';
        Campo30 := Copy(Registro,151,1);
        if Campo30 = '' then
          Campo30 := '''';
        Campo31 := Copy(Registro,152,6);
        if Campo31 = '' then
          Campo31 := '''';
        Campo32 := Copy(Registro,158,13);
        if Campo32 = '' then
          Campo32 := '''';
        cnt := cnt + 1;
        lblestado.Caption:='Estado: Insertando registro detalle ' + intToStr(cnt) + ' en TAP2_CDRS';
        lblestado.Refresh;
        insertCDR := 'insert into TAP2_CDRS values(seq_tap2_cdrs.nextval,'+intToStr(id_archivo)+',sysdate,'''','+Campo1+','''+Campo2+''','''+Campo3+''','''+Campo4+''','''+Campo5+''','''+Campo6+''','''+Campo7+''','''+Campo8+''','''+Campo9+''','''+Campo10+''','''+Campo11+''','''+Campo12+''','''+Campo13+''','''+Campo14+''','''+Campo15+''','''+Campo16+''','''+Campo17+''','''+Campo18+''','+Campo19+','+Campo20+','+Campo21+','''+Campo22+''','''+Campo23+''','''+Campo24+''','+Campo25+','+Campo26+','+Campo27+','''+Campo28+''','+Campo29+','''+Campo30+''','''+Campo31+''','''+Campo32+''')';
        rsResultCDRs.SQL.Add(insertCDR);
        rsResultCDRs.ExecSQL;
        rsResultCDRs.Close;
        rsResultCDRs.Destroy;
      end;
    end;
    i := i + 160;
  end;
  CloseFile(Arch);
  Result := cnt;
end;
Saludos
Responder Con Cita
  #5  
Antiguo 22-01-2008
Moparova Moparova is offline
Miembro
 
Registrado: Oct 2006
Posts: 42
Poder: 0
Moparova Va por buen camino
Insertar campos de longitud variable

Hola a todos, me ha servido mucho este hilo, solo que mis campos no son de longitud fija y estan separados por espacio, en este caso como los puedo ir insertando en la base de datos.

Se me ocurrio ir leyendo por palabra e irlo insertando, puedo hacer un ciclo con el pos hasta que encuentre un espacio??
Responder Con Cita
  #6  
Antiguo 22-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: May 2003
Ubicación: Guatemala
Posts: 6.243
Poder: 20
jachguate Va por buen camino
claro!

En ocasiones he hecho algo como esto:

Código Delphi [-]
function ExtraeSiguientePalabra(var S: string): string;
begin
  if pos(' ', S) <> 0 then
  begin
    Result := copy(S, 1, pos(' ', S) -1);
    Delete(S, 1, length(Result) + 1);
    //si cabe la posibilidad que haya mas de un espacio separando:
    S := Trim(S);
  end
  else begin
    Result := S;
    S := '';
  end;
end;

var
  Lineas: TStringList;
  Linea, Campo1, Campo2: string;
  
begin
  Lineas := TStringList.Create;
  try
    Lineas.LoadFromFile('c:\datos.txt');
    for I:= 0 to Lineas.Count - 1 do
    begin
      Linea := Lineas[i];
      Campo1 := ExtraeSiguientePalabra(Linea);
      Campo2 := ExtraeSiguientePalabra(Linea);
      HacerAlgoConLosCampos(Campo1, Campo2);
    end;
  finally
    Lineas.Free;
  end;
end;

Quizás compile y quizás funcione... lo he escrito acá mismo, pues no tengo delphi a mano ahora, pero espero te de una idea.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 22-01-2008
Moparova Moparova is offline
Miembro
 
Registrado: Oct 2006
Posts: 42
Poder: 0
Moparova Va por buen camino
Hola, gracias por responder ya lo probe y me marca un error en la parte de

Campo1 := ExtraeSiguientePalabra(Linea);

El error es Too Many actual parameters.

Disculpa la ignorancia pero soy novata.
Responder Con Cita
  #8  
Antiguo 22-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: May 2003
Ubicación: Guatemala
Posts: 6.243
Poder: 20
jachguate Va por buen camino
Cita:
Empezado por Moparova Ver Mensaje
Hola, gracias por responder ya lo probe y me marca un error en la parte de

Campo1 := ExtraeSiguientePalabra(Linea);

El error es Too Many actual parameters.
No tengo delphi a mano... pero ¡no puede ser! ¿estas segura de eso?
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #9  
Antiguo 22-01-2008
Moparova Moparova is offline
Miembro
 
Registrado: Oct 2006
Posts: 42
Poder: 0
Moparova Va por buen camino
Si, ese es el error que me marca.

Este es el código tal cual lo puse, aun no he hecho la parte de insertarlo en la bd.



unit funcion;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
function ExtraeSiguientePalabra: string;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Lineas: TStringList;
Linea, Campo1, Campo2: string;
I:integer;

implementation
{$R *.DFM}

function ExtraeSiguientePalabra(var S: string): string;
begin
if pos(' ', S) <> 0 then
begin
Result := copy(S, 1, pos(' ', S) -1);
Delete(S, 1, length(Result) + 1);
//si cabe la posibilidad que haya mas de un espacio separando:
S := Trim(S);
end
else
begin
Result := S;
S := '';
end;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
Lineas := TStringList.Create;
try
Lineas.LoadFromFile('c:\pruebaleer.txt');
for I:= 0 to Lineas.Count - 1 do
begin
Linea := Lineas[i];
Campo1 := ExtraeSiguientePalabra(Linea);
Campo2 := ExtraeSiguientePalabra(Linea);
//HacerAlgoConLosCampos(Campo1, Campo2);
end;
finally
Lineas.Free;
end;
end;
end.



Gracias
Responder Con Cita
  #10  
Antiguo 22-01-2008
[egostar] egostar is offline
Registrado
 
Registrado: Feb 2006
Posts: 6.378
Poder: 18
egostar Va por buen camino
Otra opción

Código Delphi [-]
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  linea := 'UNO DOS TRES CUATRO CINCO SEIS SIETE OCHO';
  repeat
     indice := pos(' ',linea);
     dato := copy(linea,1,indice);
     delete(linea,1,indice);
     if (dato <> ' ') and
        (dato <> '') then begin
           memo1.Lines.Add(dato);
     end;
  until indice = 0;
  memo1.Lines.Add(linea);
end;

Salud OS

Última edición por egostar fecha: 23-01-2008 a las 02:09:02.
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
como leer n caracteres de un archivo manolop Varios 6 18-12-2007 23:50:06
Saber cantidad de lineas que se van a leer de un fichero texto... Lester Varios 4 04-04-2007 18:57:02
Select y cantidad de caracteres Walterdf SQL 8 28-07-2006 14:21:48
mostrar el cantidad maxima de caracteres en un memo Choclito Varios 1 03-05-2006 19:10:28
Cantidad de caracteres en un edit botones67 Varios 4 09-07-2003 12:55:54


La franja horaria es GMT +2. Ahora son las 14:14:47.


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