Club Delphi  
    FTP   CCD     Enlaces   Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Desplegado
  #1  
Antiguo 25-11-2009
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 143
radge Va por buen camino
Como separar una cadena con un delimitador

Buenas uso delphi 5 y no he encontrado la forma de separar una cadena en varias mediante un limitador , ya que tengo un fichero que "importo" que tiene esta estructura

'campo1','campo2',..... y me gustaria solo leer algunos campos del fichero de texto , claro esta delimitando por el delimitador de la coma ","

alguna sugerencia ?

salu2 radge
Responder Con Cita
  #2  
Antiguo 25-11-2009
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.679
coso Va por buen camino
Hola,

prueba esto

Código Delphi [-]
var
   s1,s2 : TStringList;
   i : integer;
begin
   s1 := TStringList.Create;
   s1.LoadFromFile('c:\archivo.txt');
 
   s2 := TStringList.Create;
   s2.CommaText := s1.Text;
 
   for i := 0 to s2.Count - 1 do ShowMessage(s2[i]);
end;

Lo hago de cabeza. La idea es cargar en commatext el archivo, y el stringlist ya separa los elementos automaticamente. Un saludo.
Responder Con Cita
  #3  
Antiguo 25-11-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 18.649
roman Va por buen camino
El único problema con la propuesta de coso es que, por lo menos hasta la versión 7 de Delphi, la propiedad CommaText siempre considera los espacios como delimitadores, de forma que si tu archivo tiene una linea como esta:

84,camisas limpias,340.50,sucursal oriente

te lo separará así:

84
camisas
limpias
340.5
sucursal
oriente

Una posible solución a eso, es sustituir previamente los espacios por algún caracter que no se use en el archivo, y restaurarlos una vez asignado a CommaText, por ejemplo:

Código Delphi [-]
procedure Split(S: String; Lines: TStrings);
begin
  S := StringReplace(S, ' ', '~', [rfReplaceAll]);
  Lines.CommaText := S;
  Lines.Text := StringReplace(Lines.Text, '~', ' ', [rfReplaceAll]);
end;

// Saludos
__________________

Menos reyes y más elefantes
http://clubdelphi.com/correo_contacto_clubdelphi.png
Responder Con Cita
  #4  
Antiguo 25-11-2009
gerardus gerardus is offline
Miembro
 
Registrado: dic 2007
Posts: 43
gerardus Va por buen camino
Otra opción es usar ExtractStrings, que si respeta los blancos y permite especificar cual es el separador y cuales son los espacios en blanco

Código:
uses Classes;

var
    lCampos : TStringList;
    i: integer;
    Registro: string;
begin
    Registro := '12346; A B C D E; 25/11/2009'
    lCampos := TStringList.Create;
    ExtractStrings([';'], [' '], PChar(Registro), lCampos);
    // En el TStringList lCampos tenemos cada uno de los campos de la cadena de caracteres.
    for i := 0 to lCampos.Count-1 do
      ShowMessage(lCampos[i]);
end;
Saludos,

Gerard.

Última edición por gerardus fecha: 25-11-2009 a las 19:51:53.
Responder Con Cita
  #5  
Antiguo 25-11-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 18.649
roman Va por buen camino
¡Ah! Esta función está mucho mejor, no la conocía. Gracias gerardus.

// Saludos
__________________

Menos reyes y más elefantes
http://clubdelphi.com/correo_contacto_clubdelphi.png
Responder Con Cita
  #6  
Antiguo 25-11-2009
gerardus gerardus is offline
Miembro
 
Registrado: dic 2007
Posts: 43
gerardus Va por buen camino
Yo la encontré despues de deseperarme durante un buen rato con un TStringList de D7 que dejó de funcionar el día en que hubo blancos en uno de los campos.
Responder Con Cita
  #7  
Antiguo 25-11-2009
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.329
Lepe cantidad desconocida en este momento
Tal y como dice la ayuda de delphi para TStringlist, si las cadenas en su interior deben tener espacios, entonces hay que entrecomillarlas (dobles comillas) para que funcione correctamente delimitextText:
Código Delphi [-]

st :=TStringlist.Create;
st.CommaText := 'una, "dos con espacio",tres';
/*
st[0] = 'una'
st[1] = 'dos con espacio'
st[2] = 'tres'
*/

mistring := st.ComaText
//mistring = 'una,"dos con espacio",tres'

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 26-11-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 18.649
roman Va por buen camino
Claro Lepe, pero el formato con que se recibe el archivo no siempre está en nuestras manos, y el considerar los espacios como separadores es una vieja mala costumbre del MSDOS . Atinadamente, las nuevas versiones de Delphi ya incluyen la popiedad StrictDelimiter para no considerar los espacios como separadores.

// Saludos
__________________

Menos reyes y más elefantes
http://clubdelphi.com/correo_contacto_clubdelphi.png
Responder Con Cita
  #9  
Antiguo 26-11-2009
gerardus gerardus is offline
Miembro
 
Registrado: dic 2007
Posts: 43
gerardus Va por buen camino
Cita:
Empezado por Lepe Ver Mensaje
Tal y como dice la ayuda de delphi para TStringlist, si las cadenas en su interior deben tener espacios, entonces hay que entrecomillarlas (dobles comillas) para que funcione correctamente delimitextText:
Extraido de la ayuda de Delphi 7:

When writing DelimitedText, individual strings must be separated using QuoteChar at both ends, using Delimiter as a separator, or using both these methods.

Es decir que se pueden separar con comillas (el caracter QuoteChar), o con el caracter Delimiter o con las dos formas. Está claro que solo con el caracter Delimiter no funciona.
Tambien de la ayuda de Delphi 7:

CommaText is the same as the DelimitedText property with a delimiter of ',' and a quote character of ‘"’

Es cierto que funciona si tienes control sobre que tipo de texto vas a tratar. Si no lo tienes, no te vale .En mi caso, se trataba de una importación de datos (tipo 206190025;AA12458900000;AEFG...) que funcionó durante 3 meses sin ningún problema hasta que uno de los campos de tipo string vino con un espacio.

Cordialmente,

Gerard.
Responder Con Cita
  #10  
Antiguo 26-11-2009
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 143
radge Va por buen camino
Gracias por las respuestas voy a probar cada una de ellas y a ver cual me convenzé mas.

Por cierto tengo otra duda que no consigo resolver.



Ya que tengo esto 'campo1','campo2','campo3',...

Y al hacer

lCampos := TStringList.Create;
ExtractStrings([','], [' '], PChar(cad), lCampos);

Recibo esto en cadena
[0] = 'campo1'
[1] = 'campo2'

Ahora intento substituir todas las comas simples ' de la cadena de texto tanto del principio como del final que tengo y tengo la duda que adjunto.

StringReplace(cadena, ' como indico aquí la coma simple? ', '',[rfReplaceAll, rfIgnoreCase]);

gracias radge
Responder Con Cita
  #11  
Antiguo 26-11-2009
gerardus gerardus is offline
Miembro
 
Registrado: dic 2007
Posts: 43
gerardus Va por buen camino
StringReplace(cadena, '''', '',[rfReplaceAll, rfIgnoreCase])

Saludos,

Gerard.
Responder Con Cita
  #12  
Antiguo 26-11-2009
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 143
radge Va por buen camino
Me expresé mal tengo doble comita simple es decir

''campo1''
''campo2''
...

He probado así y devuelve el mismo resultado
StringReplace(prd_codi, ' '' ', '',[rfReplaceAll, rfIgnoreCase]);

salu2 radge
Responder Con Cita
  #13  
Antiguo 26-11-2009
gerardus gerardus is offline
Miembro
 
Registrado: dic 2007
Posts: 43
gerardus Va por buen camino
Cuando digo StringReplace(cadena, '''', '',[rfReplaceAll, rfIgnoreCase]), la cadena a remplazar no es comilla simple-comilla doble-comilla simple, sinó comilla simple-comilla simple-comilla simple-comilla simple (4 comillas simples, sin espacios entre ellas ni nada).

Código:
var
  cadena: string;
begin
  Cadena := '''''Campo1''''';
  ShowMessage(cadena);
  ShowMessage(StringReplace(cadena, '''', '',[rfReplaceAll, rfIgnoreCase]));
Esto a mi me funciona. La primera vez me muesta campo1 entre dobles comillas simples, y limpio la segunda vez.

Saludos,

Gerard.
Responder Con Cita
Respuesta


Herramientas
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cambiar delimitador decimal peccatum Tablas planas 5 01-04-2009 17:55:41
Como separar los reportes de la aplicacion? Carlos Arevalo Impresión 4 21-04-2008 16:52:04
Separar cadena de numeros cyborgve Impresión 1 16-05-2007 06:37:31
como separar la fecha ddd_ddd Varios 1 23-10-2005 19:18:47
Como separar las barras de una grafica hook Varios 0 17-06-2004 18:28:34


La franja horaria es GMT +2. Ahora son las 08:24:37.


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