remover caracter de uma string
estou importando dados de um arquivo TXT até ai tudo bem, mas qdo pego o codigo do Pedido que esta nesta posição 311
ele não me retorna somente o codigo e sim pedaço dele + ponto e virgula.
qdo abri o TXT no Notepad vrf que os registros que estavam dando erro tinham um caracter estranho que imagino ser um enter.
- a duvida é, como faço pra substituir esse caracater por espaço.
Copy(StringAux,311,12)
ele não me retorna somente o codigo e sim pedaço dele + ponto e virgula.
qdo abri o TXT no Notepad vrf que os registros que estavam dando erro tinham um caracter estranho que imagino ser um enter.
- a duvida é, como faço pra substituir esse caracater por espaço.
Carlos_tedex
Curtidas 0
Respostas
Pestana_
19/11/2007
use o StringReplace para substituir o caracter estranho por um espaço em branco.
S é a string original a qual será alterada pelas substrings.
OldPattern é a substring que será localizada e substituida pela a NewPattern.
Flags indica como será localizado e substituido as ocorrências de OldPattern. Se Flags não incluir [rfReplaceAll] stringReplace somente substituirá a primeira ocorrência de OldPattern em S, caso contrario, a StringReplace substiruirá todas as instâncias de OldPattern com NewPattern.
Se o parâmetro Flags incluir rfIgnoreCase a comparação irá ser case insensitive.
se houver um caracter estranho, então faça mais ou menos assim: StringReplace(Texto, localizarString, ´´, [];
function StringReplace(const S: string; const OldPattern: string; const NewPattern: string; Flags: TReplaceFlags): string;
S é a string original a qual será alterada pelas substrings.
OldPattern é a substring que será localizada e substituida pela a NewPattern.
Flags indica como será localizado e substituido as ocorrências de OldPattern. Se Flags não incluir [rfReplaceAll] stringReplace somente substituirá a primeira ocorrência de OldPattern em S, caso contrario, a StringReplace substiruirá todas as instâncias de OldPattern com NewPattern.
Se o parâmetro Flags incluir rfIgnoreCase a comparação irá ser case insensitive.
se houver um caracter estranho, então faça mais ou menos assim: StringReplace(Texto, localizarString, ´´, [];
GOSTEI 0
Pestana_
19/11/2007
é necessario declarar na unit [color=green:bb166db276][b:bb166db276]SysUtils[/b:bb166db276][/color:bb166db276]
flw.
flw.
GOSTEI 0
Carlos_tedex
19/11/2007
use o StringReplace para substituir o caracter estranho por um espaço em branco.
se houver um caracter estranho, então faça mais ou menos assim: StringReplace(Texto, localizarString, ´´, []);
Caro Pestana_
Entendi o funcionamento desta função mas seguindo seu exemplo acima como vou mandar substituir algo que eu não sei o que é. Quando eu edito o arquivo TXT no notepad aparece uns quadrados... tentei localizar pelo codigo decimal 13 mas tb não obtive resultado.
Caso vc tenha um email para que eu possa lhe passar o arq TXT pra vc dar uma analisada.
mas desde já agradeço pela dica, pois essa função será de grande serventia.
qq novidade posta aqui pra nois... valew
GOSTEI 0
Pestana_
19/11/2007
foi você que criou este arquivo TXT?
este arquivo não está criptografado não né?
como foi feito o processo de gravar em arquivo TXT?
flw.
este arquivo não está criptografado não né?
como foi feito o processo de gravar em arquivo TXT?
flw.
GOSTEI 0
Carlos_tedex
19/11/2007
foi você que criou este arquivo TXT?
este arquivo não está criptografado não né?
como foi feito o processo de gravar em arquivo TXT?
- Esse arquivo foi criado por outro programador a qual não conheço.
- O arquivo não esta criptografado.
- O processo de geração desse TXT eu tb não saberia lhe dizer, pois quem o gerou foi um terceiro.
Outras formas que tentei usar o StringReplace mas sem resultados:
Str := StringReplace(S,#1310,32,[rfReplaceAll]); Str := StringReplace(S,$D$A,32,[rfReplaceAll]); Str := StringReplace(S,sLineBreak,32,[rfReplaceAll]);
GOSTEI 0
Vitor Alcantara
19/11/2007
Se você não sabe quais caracteres ´estranhos´ poderão a vir, por que você não testa os caracteres permitidos.
um pequeno exemplo abaixo.
um pequeno exemplo abaixo.
function SoCaracteresPermitidos(s:string):string; var x:Integer; sAux:String; begin sAux := ´´; for x := 1 to Length(s) do //Aqui eu testo se são caracteres alphanuméricos comuns ou virgula (,) if s[x] in [´a´..´z´,´A´..´Z´, ´0´..´9´, ´,´] then sAux := sAux + s[x]; result := sAux; end;
GOSTEI 0
Carlos_tedex
19/11/2007
seguinte Vitor,
testei sua função e realmente ela deixou apenas os caracteres válidos. Mas ainda sim não consegui inserir um espaço em branco no local do caracter estranho. Alterei sua função para qdo for detectado um caracter que não contiver no if ele move espaço. Mas mesmo assim não foi. Confere ai:
mas agradeço a atenção... valew
testei sua função e realmente ela deixou apenas os caracteres válidos. Mas ainda sim não consegui inserir um espaço em branco no local do caracter estranho. Alterei sua função para qdo for detectado um caracter que não contiver no if ele move espaço. Mas mesmo assim não foi. Confere ai:
for x := 1 to Length(s) do
if s[x] in [´a´..´z´,´A´..´Z´, ´0´..´9´, ´,´, ´;´, ´ ´, ´/´, ´\´, ´|´, ´"´,
´-´, ´=´, ´(´, ´)´, ´{´, ´}´, ´[´, ´]´, ´.´, ´:´] then
sAux := sAux + s[x]
else
sAux := sAux + 32;
mas agradeço a atenção... valew
GOSTEI 0
Vitor Alcantara
19/11/2007
tenta assim
for x := 1 to Length(s) do
if s[x] in [´a´..´z´,´A´..´Z´, ´0´..´9´, ´,´, ´;´, ´ ´, ´/´, ´\´, ´|´, ´"´,
´-´, ´=´, ´(´, ´)´, ´{´, ´}´, ´[´, ´]´, ´.´, ´:´] then
sAux := sAux + s[x]
else
sAux := sAux + ´ ´; //caractere em brancoGOSTEI 0
Carlos_tedex
19/11/2007
amigo tb ja tinha tentado assim mas tb nada... vou tentar colocar o link do arquivo pra vc´s baixarem...
valew
valew
GOSTEI 0
Carlos_tedex
19/11/2007
Caso alguem queira baixar o arquivo para testar.
Observe que o caracter estranho esta na posição 305
[url]http://www.pro-controll.com.br/teste.zip[/url]
valew
Observe que o caracter estranho esta na posição 305
[url]http://www.pro-controll.com.br/teste.zip[/url]
valew
GOSTEI 0
Luciano.lirio
19/11/2007
Tente usar desta forma, acho que vai dar certo. os caracteres que não estão no IF serão substituidos por um espaço em branco.
var
s: String;
x: Integer;
begin
s := ´José´+#08+´da´+10+´Silva´+13+´Sauro´;
for x := 1 to Length(s) do
if not (s[x] in [´a´..´z´,´A´..´Z´, ´0´..´9´, ´,´, ´;´, ´ ´, ´/´, ´\´, ´|´, ´"´,
´-´, ´=´, ´(´, ´)´, ´{´, ´}´, ´[´, ´]´, ´.´, ´:´]) then
s[x] := ´ ´;
ShowMessage(s);
GOSTEI 0
Comodelphi
19/11/2007
Cara, esse arquivo parece ter um delimitador que é o ponto e virgula, além disso, ele parece não ter um lay-out fixo para o tamanho dos campos pois tem campos memo no meio e o caracter estranho, é um CR+LF, Chr(13) + Chr(10). Você teria que que substituir e recriar o arquivo pra ler sequencialmente em linha, e além disso esse campo memo não pode variar de tamanho para voce ter sempre o código do pedido na coluna 311. Eu pediria para a pessoa que gera o arquivo gerar já num formato mais conveniente.
abcs.
abcs.
GOSTEI 0
Luciano.lirio
19/11/2007
carlos_tedex,
pelo que vi no arquivo, o problema está na quebra das linhas, note que a terceira linha não está com quebra e o código do pedido está na mesma linha, as demais linhas estão com o código do pedido na próxima linha.
pelo que vi no arquivo, o problema está na quebra das linhas, note que a terceira linha não está com quebra e o código do pedido está na mesma linha, as demais linhas estão com o código do pedido na próxima linha.
GOSTEI 0
Comodelphi
19/11/2007
Se vc estiver usando ReadLn, esses caracteres não aparecem na string, pois são justamente os caracteres de controle (chr(13) + chr(10)) que indicam uma nova linha no arquivo. Se vc ler cada Char do arquivo e substituir por outra coisa qualquer ai vc não vai ter quebra de linha nenhuma, teria um arquivo com uma única linha.
GOSTEI 0
Luciano.lirio
19/11/2007
Consegui ler teu arquivo em problemas com o código abaixo.
function LimpaInvalidos(const _Str: String): String; var X: Integer; begin Result := _Str; for X := 1 to Length(Result) do if (Result[X] in [13]) then Result[X] := ´ ´; end; function PartStr(const _Str: String; const _Chr: String; const _NumPart: Integer): String; var I: Integer; strTemp: String; begin strTemp := _Str; for I := 1 to _NumPart do begin if Pos(_Chr,strTemp) > 0 then begin Result := Copy(strTemp,1,Pos(_Chr,strTemp)-1); Delete(strTemp,1,Pos(_Chr,strTemp)); end else begin Result := strTemp; strTemp := ´´; end; end; end; procedure TForm1.Button1Click(Sender: TObject); var ArqEnt: TextFile; Linha: String; Campos: Array[1..20] of String; begin Reset(ArqEnt,´C:\Downloads\TESTE.txt´); while not eof(ArqEnt) do begin ReadLn(ArqEnt,Linha); // Verifica se a linha começa com 1 caso contrário cancela o processamento. if Linha[1] <> ´1´ then raise Exception.Create(´Arquivo Inválido.´); Campos[01] := PartStr(Linha,´;´,01); Campos[02] := PartStr(Linha,´;´,02); Campos[03] := PartStr(Linha,´;´,03); Campos[04] := PartStr(Linha,´;´,04); Campos[05] := PartStr(Linha,´;´,05); Campos[06] := PartStr(Linha,´;´,06); Campos[07] := PartStr(Linha,´;´,07); Campos[08] := PartStr(Linha,´;´,08); Campos[09] := PartStr(Linha,´;´,09); Campos[10] := PartStr(Linha,´;´,10); Campos[11] := PartStr(Linha,´;´,11); Campos[12] := PartStr(Linha,´;´,12); Campos[13] := PartStr(Linha,´;´,13); Campos[14] := PartStr(Linha,´;´,14); Campos[15] := PartStr(Linha,´;´,15); Campos[16] := PartStr(Linha,´;´,16); Campos[17] := PartStr(Linha,´;´,17); Campos[18] := PartStr(Linha,´;´,18); Campos[19] := LimpaInvalidos(PartStr(Linha,´;´,19)); Campos[20] := PartStr(Linha,´;´,20); end; CloseFile(ArqEnt); end;
GOSTEI 0
Carlos_tedex
19/11/2007
luciano.lirio,
Meu camarada testei sua função e desta forma de armazenar cada campo em um array ficou bem funcional. É isso mesmo que eu precisa no momento cara. valew
Agradeço a atenção de todos que colaboraram nesta luta contra um TXT... rsrsrs
Abraços...
Meu camarada testei sua função e desta forma de armazenar cada campo em um array ficou bem funcional. É isso mesmo que eu precisa no momento cara. valew
Agradeço a atenção de todos que colaboraram nesta luta contra um TXT... rsrsrs
Abraços...
GOSTEI 0