Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   eliminar lineas de un txt. (https://www.clubdelphi.com/foros/showthread.php?t=24345)

danytorres 17-08-2005 16:37:11

eliminar lineas de un txt.
 
buenos dias amigos del foro, estoy trabajando con una coletora de datos que genera un txt, el problema esta que el archivo tiene lineas en blanco y cuando lo estoy leyendo para insertarlo en la BD me presenta un error, la pregunta es como hago para eliminar las lineas en blanco del txt. Gracias.

jmariano 17-08-2005 17:10:04

Saludos!

¿Como estás leyendo el archivo?, te lo pregunto porque podrías probar a utilizar la clase "TStringList" para leer el archivo a través del método "LoadFromFile" y, una vez leído, crear un bucle que recorra cada elemento y elimine las líneas en blanco, ejemplo:

Código Delphi [-]
var
  I: Integer;
begin
  with TStringList.Create do
  begin
    LoadFromFile('Prueba.txt');

    for I := 0 to Count - 1 do
      if Strings[i] = '' then
        Delete(I);

    Free;
  end;
end;

(Claro que todo dependerá de como sea la estructura del archivo .txt)

Chao!

danytorres 17-08-2005 17:16:47

Gracias por responder jmariano, el txt lo leo de esta manera:

Code:
______________________________________________________________
Archivo.LoadFromFile('C:INVENTARIO.txt');

for I := 0 to Archivo.Count -1 do
begin
Campos.Clear;
Campos.CommaText:= Archivo[i];
Codigo:= Campos[0];
end;
______________________________________________________

jmariano 17-08-2005 17:22:56

Ok, entonces prueba simplemente:

Código Delphi [-]
  Archivo.LoadFromFile('C:INVENTARIO.txt');

  for I := 0 to Archivo.Count -1 do
  begin
    Campos.Clear;
    
    if Archivo[i] <> '' then
    begin
      Campos.CommaText:= Archivo[i];
      Codigo:= Campos[0];
    end; 
  end;

Es, básicamente, lo mismo que te comenté pero ignorando las líneas en blanco.

danytorres 17-08-2005 17:24:45

Gracias por responder, pero no funciona???

roman 17-08-2005 17:34:00

¿No será que las líneas en blanco no están tan blancas? En lugar de poner

Código Delphi [-]
if Archivo[i] <> '' then

intenta con

Código Delphi [-]
if Trim(Archivo[i]) <> '' then

// Saludos

danytorres 17-08-2005 18:02:00

Gracias por responder roman, pero me da error: incompatible string and boolean ?

danytorres 17-08-2005 18:09:14

ya logre correr el trim, pero igual me da error al leer por la linea en blanco

maeyanes 17-08-2005 18:11:51

Prueba con:
Código Delphi [-]
if Pos(',', Archivo[i]) > 0 then
begin
  Campos.CommaText:= Archivo[i];
  //...


Saludos...

roman 17-08-2005 18:21:46

Cita:

Empezado por danytorres
ya logre correr el trim, pero igual me da error al leer por la linea en blanco

Entonces creo que el archivo txt te está dando otros problemas además de las líneas en blanco. Haz un debug para ver qué contiene la línea del archivo cuando te marca error. Por cierto que hasta ahora no nos has dicho cuál es ese error.

// Saludos

jmariano 17-08-2005 18:24:20

Si aplicando la solución de maeyanes te sigue dando error, entonces, comprueba que la línea en blanco no sea una línea de tipo: ,,,,,,,,, (es decir, donde no hubo registros o si todos fueron valores nulos que no haya una línea con solo el delimitador de campo, en este caso ",").

danytorres 17-08-2005 18:40:58

Disculpen por no decir el error: EstringListError 'List index out of bounds (0)',

Nose como corregirlo.

dec 17-08-2005 18:43:32

Hola,

Estoy con roman. Sobre la instrucción:

Código Delphi [-]
 Strings[i] = ''
... pulsa la tecla "F5", esto es, crea un "punto de ruptura" para que el programa se detenga en ese punto al ejecutarse: eso te dará pie a averiguar (simplemente poniendo el cursor sobre la variable que precises) qué contienen las líneas del archivo, y así hacerte idea de qué está pasando y, en todo caso, qué puedes hacer para solucionar el problema.

jmariano 17-08-2005 18:44:44

Está claro que el error debe de estar en la variable "Campos" que no tiene elementos. Prueba lo siguiente:

Código Delphi [-]
    ... 
    Campos.CommaText:= Archivo[i];
 
    if Campos.Count > 0 then
      Codigo:= Campos[0];
    ...

dec 17-08-2005 18:47:20

Hola,

Esto probablemente ocurra por andar averiguando (*) el error... lo digo porque mi anterior mensaje iba destinado a la solución de otro error y no el que mencionas. ¡Pero también puede servirte! Puedes averiguar el valor de la variable contador a cada paso por el bucle, y ver también qué está pasando en el mismo.

En todo caso, creo que lo mejor sería que copiaras aquí el código al completo del bucle que te está dando problemas: probablemente a partir de éste alguien sabrá darte una solución al problema en cuestión.

(*) Otrosí, nadie me obligaba a hacer de adivino.

danytorres 18-08-2005 16:20:17

Gracias a todos por responder pero e intentado todo lo que me recomendaron y sigue dandome el mismo error. Que hago

mamcx 18-08-2005 16:41:40

Pon un ejemplo de los datos. Siempre con este tipo de programas se debe postear Codigo + Estructura datos + Datos ejemplo

danytorres 18-08-2005 17:08:30

Gracias por responder el codigo es el siguiente;

Code:
__________________________________________________________

procedure TInventarios.Button2Click(Sender: TObject);
vAR
Archivo,Campos: TStringList;
I, J: Integer;
Codigo: string;
Cant : real;
Linea : Integer;
begin
Archivo:= TStringList.Create;
Campos:= TStringList.Create;

try
Archivo.LoadFromFile('C:\INVENTARIO.txt');


for I := 0 to Archivo.Count -1 do
begin

Campos.Clear;
Campos.CommaText:= Archivo[i];
Codigo:= Campos[0];
Cant:= Strtofloat(Campos[1]);

If (Codigo <> '') and (Cant > 0) then
begin


Linea:= Linea + 1;
DataModule1.STOMOV.Insert;
DataModule1.STOMOV.Fields[1].Value := 1;
DataModule1.STOMOV.Fields[3].Value := Linea;
DataModule1.STOMOV.Fields[4].Text := DateToStr(Now);
DataModule1.STOMOV.Fields[5].Value := 530;
DataModule1.STOMOV.Fields[7].Value := strToInt(Edit4.text);
DataModule1.STOMOV.Fields[8].Text := Codigo;
DataModule1.STOMOV.Fields[9].Value := Cant;
DataModule1.STOMOV.Post;
end;

end;

finally
Archivo.Free;
Campos.Free;
end;
________________________________________________________________

Y el txt tine esta forma:
_______________________________________
802404041500080,1800,
, ,
802404041500080,1800,
_______________________________________

Que puedo hacer?

roman 18-08-2005 17:14:47

¿Y dónde están las condiciones de las que hemos estado hablando en todo el hilo?

Asignas Campos[0] a Codigo sin antes haber checado nada de lo que comentamos. Tanto en líneas en blanco como en líneas con sola comas, esa asignación te va a dar el error descrito.

// Saludos

danytorres 18-08-2005 17:29:29

Roman, las e probado una a una, este es el codigo original.

jmariano 18-08-2005 18:48:30

Prueba los siguiente (a ver si hay suerte)

Código Delphi [-]
procedure TInventarios.Button2Click(Sender: TObject);
var
  Archivo,Campos: TStringList;
  I, J: Integer;
  Codigo: string;
  Cant : real;
  Linea : Integer;
begin
  Archivo:= TStringList.Create;
  Campos:= TStringList.Create;

  try
    Archivo.LoadFromFile('C:\INVENTARIO.txt');

    for I := 0 to Archivo.Count -1 do
    begin
      Codigo := '';
      Cant := 0;
      Campos.Clear;
      Campos.CommaText:= Archivo[i];

      if Campos.Count >= 2 then
      begin
        Codigo:= Campos[0];
        Cant:= Strtofloat(Campos[1]);
      end;

      if (Codigo <> '') and (Cant > 0) then
      begin
        Linea:= Linea + 1;
        DataModule1.STOMOV.Insert;
        DataModule1.STOMOV.Fields[1].Value := 1;
        DataModule1.STOMOV.Fields[3].Value := Linea;
        DataModule1.STOMOV.Fields[4].Text := DateToStr(Now);
        DataModule1.STOMOV.Fields[5].Value := 530;
        DataModule1.STOMOV.Fields[7].Value := strToInt(Edit4.text);
        DataModule1.STOMOV.Fields[8].Text := Codigo;
        DataModule1.STOMOV.Fields[9].Value := Cant;
        DataModule1.STOMOV.Post;
      end;
    end;
  finally
    Archivo.Free;
    Campos.Free;
  end;
end;

(Como verás, he respetado tu código original añadiéndole sólo unas sentencias)

Chao!

danytorres 18-08-2005 20:22:00

Amigos nose que mas intentar. pero no encuentro la solucion.

roman 18-08-2005 20:32:21

Haz un trazado de la aplicación y dinos exactamente qué contiene la línea del archivo en donde te lanza el error.

// Saludos

jmariano 18-08-2005 20:39:37

¿Probaste el código que especifiqué mas arriba? ¿Que error te dió?.

danytorres 18-08-2005 20:40:59

Roman, el archivo lo genera una pistota de codigos de barra cuando el operador presiona enter en la pistola se genera una lina en blanco en el archivo, esa linea contienedos comas ,,

y el error que me da es cuando le asigno un string vacio a una variable real;

Code:
_________________________________
Cant:= Strtofloat(Campos[1]);
_________________________________

Esto ocurre porque nose como saltar la linea un blanco, bueno tiene dos espacios un blancos separados por dos coma.

jmariano 18-08-2005 20:46:40

Entonces, te valdría con sólo probar que "Campos[1]" no esté vacio antes de asignar el valor

Código Delphi [-]
    ...
    if Campos[1] <> '' then
      Cant := Strtofloat(Campos[1]);
    ...

danytorres 18-08-2005 20:47:58

si jmariano lo probe pero no detiene la linea en blanco,

code:
_______________________________________________
if Campos.Count >= 2 then
begin
Codigo:= Campos[0];
Cant:= Strtofloat(Campos[1]);
end;
_____________________________________________________

el detalle es que campo se es igual a dos por lo siguiente, es como le espleque a roman, la linea en blanco esta formada por dos espacios en blancos que son los dos campos que captura la lectora perop estos estan separados por comas, entonces campos es igial a dos porque esta formado por dos string en blanco.

jmariano 18-08-2005 20:51:27

Sip, ya me di cuenta jeje! (se ve que posteamos casi al mismo tiempo). Pero fíjate en la sentencia que puse antes de tu mensaje (la sentencia "if")

(Eso sí, siempre reinicia las variables "Codigo" y "Cant" por cada línea que leas del archivo)

danytorres 18-08-2005 21:14:30

Gracias jmariano y a todos por el interes en ayudarme, ya resolvi el pequeño problema. Hay momentos en que uno esta mentalmente agotado y la solucion estan sencilla que no la ves. Gracias

haa la solucion fue esta;

Code:
__________________________________________
Cant := 0;
Campos.Clear;
Campos.CommaText:= Archivo[i];

if (Campos[0] <> '') and (Campos[1] <> '') then
begin
Codigo:= Campos[0];
Cant:= Strtofloat(Campos[1]);
end;
____________________________________________


La franja horaria es GMT +2. Ahora son las 16:39:27.

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