Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Leer una cierta cantidad de caracteres de una archivo. (https://www.clubdelphi.com/foros/showthread.php?t=51525)

mcalmanovici 18-12-2007 15:14:52

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.

juanlaplata 18-12-2007 16:06:28

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;


maeyanes 18-12-2007 16:33:30

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...

mcalmanovici 19-12-2007 20:06:19

Solución
 
Cita:

Empezado por maeyanes (Mensaje 253271)
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

Moparova 22-01-2008 00:46:22

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?? :)

jachguate 22-01-2008 03:24:09

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.

;)

Moparova 22-01-2008 19:33:25

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. :)

jachguate 22-01-2008 19:54:38

Cita:

Empezado por Moparova (Mensaje 260034)
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?

Moparova 22-01-2008 20:52:32

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 :confused:

egostar 22-01-2008 21:01:24

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


La franja horaria es GMT +2. Ahora son las 11:45:17.

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