PDA

Ver la Versión Completa : eliminar lineas de un txt.


danytorres
17-08-2005, 16:37:11
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:


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:


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


if Archivo[I] <> '' then


intenta con


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:

if Pos(',', Archivo[I]) > 0 then
begin
Campos.CommaText:= Archivo[I];
//...



Saludos...

roman
17-08-2005, 18:21:46
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:


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:


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


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


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