Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-11-2005
Avatar de edgusano
edgusano edgusano is offline
Miembro
 
Registrado: abr 2004
Ubicación: Medellin Colombia
Posts: 180
Poder: 21
edgusano Va por buen camino
tstringlist y nulos

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/show...ight=%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.
__________________
Optimus Prime
Responder Con Cita
  #2  
Antiguo 16-11-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Estaría bien que nos pusieras el código modificado, coo mínimo para verlo.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 16-11-2005
Avatar de edgusano
edgusano edgusano is offline
Miembro
 
Registrado: abr 2004
Ubicación: Medellin Colombia
Posts: 180
Poder: 21
edgusano Va por buen camino
Aqui esta el codigo con las infimas modificaciones
Código Delphi [-]
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.
__________________
Optimus Prime
Responder Con Cita
  #4  
Antiguo 17-11-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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):

Código Delphi [-]
   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...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 17-11-2005 a las 09:18:21. Razón: Resaltar código nuevo
Responder Con Cita
  #5  
Antiguo 17-11-2005
Avatar de edgusano
edgusano edgusano is offline
Miembro
 
Registrado: abr 2004
Ubicación: Medellin Colombia
Posts: 180
Poder: 21
edgusano Va por buen camino
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.
__________________
Optimus Prime
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 23:35:16.


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
Copyright 1996-2007 Club Delphi