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 |
Hola,
prueba esto
Lo hago de cabeza. La idea es cargar en commatext el archivo, y el stringlist ya separa los elementos automaticamente. Un saludo. |
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:
// Saludos |
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:
Gerard. |
¡Ah! Esta función está mucho mejor, no la conocía. Gracias gerardus.
// Saludos |
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:
|
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:
Saludos |
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 |
Cita:
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. |
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 |
StringReplace(cadena, '''', '',[rfReplaceAll, rfIgnoreCase])
Saludos, Gerard. |
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 |
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 Saludos, Gerard. |
Cita:
No olvides nuestra guía de estilo, gracias. |
La franja horaria es GMT +2. Ahora son las 18:04: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