GARANTIR DESCONTO

Fórum remover caracter de uma string #349206

19/11/2007

0

estou importando dados de um arquivo TXT até ai tudo bem, mas qdo pego o codigo do Pedido que esta nesta posição 311
 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

Carlos_tedex

Responder

Posts

19/11/2007

Pestana_

use o StringReplace para substituir o caracter estranho por um espaço em branco.

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, ´´, [];


Responder

Gostei + 0

19/11/2007

Pestana_

é necessario declarar na unit [color=green:bb166db276][b:bb166db276]SysUtils[/b:bb166db276][/color:bb166db276]



flw.


Responder

Gostei + 0

20/11/2007

Carlos_tedex

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


Responder

Gostei + 0

20/11/2007

Pestana_

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.


Responder

Gostei + 0

20/11/2007

Carlos_tedex

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]);



Responder

Gostei + 0

20/11/2007

Vitor Alcantara

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.

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;



Responder

Gostei + 0

20/11/2007

Carlos_tedex

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:

  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


Responder

Gostei + 0

20/11/2007

Vitor Alcantara

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 branco



Responder

Gostei + 0

21/11/2007

Carlos_tedex

amigo tb ja tinha tentado assim mas tb nada... vou tentar colocar o link do arquivo pra vc´s baixarem...

valew


Responder

Gostei + 0

21/11/2007

Carlos_tedex

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


Responder

Gostei + 0

21/11/2007

Luciano.lirio

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);



Responder

Gostei + 0

21/11/2007

Comodelphi

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.


Responder

Gostei + 0

21/11/2007

Luciano.lirio

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.


Responder

Gostei + 0

21/11/2007

Comodelphi

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.


Responder

Gostei + 0

21/11/2007

Luciano.lirio

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;



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar