remover caracter de uma string

Delphi

19/11/2007

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

Curtidas 0

Respostas

Pestana_

Pestana_

19/11/2007

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


GOSTEI 0
Pestana_

Pestana_

19/11/2007

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



flw.


GOSTEI 0
Carlos_tedex

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_

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.


GOSTEI 0
Carlos_tedex

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

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.

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

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:

  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

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 branco



GOSTEI 0
Carlos_tedex

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


GOSTEI 0
Carlos_tedex

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


GOSTEI 0
Luciano.lirio

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

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.


GOSTEI 0
Luciano.lirio

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.


GOSTEI 0
Comodelphi

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

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

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...


GOSTEI 0
POSTAR