PDA

Ver la Versión Completa : tstringlist y nulos


edgusano
15-11-2005, 23:59:50
Hola a todos.
Mi duda es la siguiente, estoy utilizando un metodo el cual publico roman para el tratamiento de archivos csv, utilizando 2 tstringlist, en este hilo http://www.clubdelphi.com/foros/showthread.php?t=14398&highlight=%2Acsv%2A

Luego de hacerle unas modificaciones a este, dado que el archivo que debo tomar esta separado por tabuladores, me encuentro que el archivo tiene campos nulos, es decir, aparecen dos o mas tabuladores seguidos, y al contar los campos de forma manual son 26 pero el stringlist en su propiedad count solo dice que ahi 23 y analizando veo que los que estan con nulos no los toma. Ademas hice modificaciones como modificando la propiedad referente a informacion duplicada, pero no sigue igual, el problema es que si no me toma estos nulos se me corren los campos a insertar y me salta una excepcion por tipo de valores no compatibles.

Podrian ayudarme con este problema, a todos gracias.

Neftali [Germán.Estévez]
16-11-2005, 09:38:29
Estaría bien que nos pusieras el código modificado, coo mínimo para verlo.

edgusano
16-11-2005, 15:02:05
Aqui esta el codigo con las infimas modificaciones :D

var
ArchivoCsv, Campos: TStringList;
I, J: Integer;

begin
ArchivoCsv := TStringList.Create;
Campos := TStringList.Create;
Campos.Delimiter := #9;
try
ArchivoCsv.LoadFromFile(JvDirectoryEdit.EditText+'\'+Archivo);
for I := 0 to ArchivoCsv.Count - 1 do
begin
Campos.Clear;
Campos.DelimitedText := ArchivoCsv[I];
if(Campos.Count > 5 ) then
begin
ADOTableImporta.Insert;
//for J := 0 to ADOTableImporta.FieldCount - 1 do
for J := 0 to Campos.Count - 1 do
begin
ADOTableImporta.Fields[J].Value := Campos[J];
end;
ADOTableImporta.Post;
end;
end;
finally
ArchivoCsv.Free;
Campos.Free;
end;
end;


El condicional en el cual pregunto por cuantos campos tiene el segundo tstringlist es porque en el archivo que proceso, viene un encabezado el cual no se debe procesar, ademas alguno similar a este se encontraria en otras partes del archivo, aqui pongo una muestra del archivo que estoy procesando:
00000MOVIMIENTOS
1086 1086000005080 0000000000001 NOE 21221662 1 9026 2005/08/29 2002/01/21 1969/12/31 19:00:00 570110 1027 00000061543 2 890934479 294999.00 570110 1005 00002462367 2 70546209 0
1086 1086000005080 0000000000001 NOE 21221662 2 9026 2005/08/29 2002/01/21 1969/12/31 19:00:00 570110 1027 00000061543 2 890934479 318461.00 570110 1006 00007976678 2 15365232 0

Espero esta vez si haya mas informacion con la cual me puedan ayudar con este problemita.

Neftali [Germán.Estévez]
17-11-2005, 09:14:40
Puedes realizar un "preproceso" antes de obtener los campos para cambiar las dos tabulaciones que vengas seguidas por otro valor.
Por ejemplo, cuando encuentres #9#9 (dos tabulaciones) lo modificas por #9$$$#9.
De ésta forma tendrás en número de campos completo, pero los nulos vendrán con valor $$$; Luego es cuestión de detectarlos y añadirlos como nulos.

No se si me he explicado bien; Algo así (no lo he compilado, así que tal vez haya algun error, pero espero que la idea se entienda):


var
ArchivoCsv, Campos: TStringList;
I, J: Integer;
Str:String;
begin
ArchivoCsv := TStringList.Create;
Campos := TStringList.Create;
Campos.Delimiter := #9;
try
ArchivoCsv.LoadFromFile(JvDirectoryEdit.EditText+'\'+Archivo);
for I := 0 to ArchivoCsv.Count - 1 do
begin
// Preproceso
Str := AnsiReplaceStr(ArchivoCsv[I], #9#9, #9+'$$$'+#9);

Campos.Clear;
Campos.DelimitedText := Str{ArchivoCsv[I]};
if(Campos.Count > 5 ) then
begin
ADOTableImporta.Insert;
//for J := 0 to ADOTableImporta.FieldCount - 1 do
for J := 0 to Campos.Count - 1 do
begin
// Es un nulo?
if (Campos[J] = '$$$') then begin
ADOTableImporta.Fields[J].Clear;
end
else begin
ADOTableImporta.Fields[J].Value := Campos[J];
end;
end;
ADOTableImporta.Post;
end;
end;
finally
ArchivoCsv.Free;
Campos.Free;
end;
end;


NOTA: He intentado resaltar el texto nuevo, y no si se ve peor o mejor...:D:D:D

edgusano
17-11-2005, 22:06:54
Hola neftali
Gracias por tu respuesta, lastima que cuando llego ya habia hecho otra cosa para solucionarlo, pero veo que lo que muestras ahi es excelente para resolver mi problema. Les cuento que hice para solucionar el problemita:
Acudi a torrynet y mediante la busqueda, encontre una compenente para tratar archivos csv llamada PBParsers la cual FWS
Aunque tuve que hacer unas pequeñas cosillas para el tratamiento de mi archivo por la peculiaridad que este no tiene como promera fila el encabezado de las columnas si no otra cosa, pueden ver esto en una de las respuestas anteriores. Esta componente si me reportaba cuando habia un campo nulo en la fila a procesar.

De nuevo muchas gracias Neftali, lastima que para esta vez no pueda utilizar esa solucion. Sera para una proxima vez.