Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como separar una cadena con un delimitador (https://www.clubdelphi.com/foros/showthread.php?t=65172)

radge 25-11-2009 18:51:54

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

coso 25-11-2009 19:02:40

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.

roman 25-11-2009 19:38:42

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

gerardus 25-11-2009 19:44:55

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.

roman 25-11-2009 20:06:55

¡Ah! Esta función está mucho mejor, no la conocía. Gracias gerardus.

// Saludos

gerardus 25-11-2009 20:23:04

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. :confused::mad:

Lepe 25-11-2009 23:37:27

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

roman 26-11-2009 02:18:04

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

gerardus 26-11-2009 09:37:43

Cita:

Empezado por Lepe (Mensaje 347454)
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.

radge 26-11-2009 09:48:09

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

gerardus 26-11-2009 10:10:41

StringReplace(cadena, '''', '',[rfReplaceAll, rfIgnoreCase])

Saludos,

Gerard.

radge 26-11-2009 10:28:47

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

gerardus 26-11-2009 15:32:48

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.

Casimiro Notevi 05-03-2016 22:52:52

Cita:

Empezado por Jasan_Records (Mensaje 502996)
Hola Muchachos!, Tengo un campo que guarda un dato como este: pc-12345-a-16, la consulta es como podria hacer la codificacion para separar la cadena delimitado por el - y que se muestre cada uno en un edit. por ejemplo edit1:pc, edit2:12345, edit3:a y edit4:16. espero su ayuda, Gracias.

Crea un hilo nuevo con tu consulta, gracias. Tu pregunta no aporta nada a la solución de este tema.
No olvides nuestra guía de estilo, gracias.


La franja horaria es GMT +2. Ahora son las 17:16:00.

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