PDA

View Full Version : Steuerzeichen aus einem CHAR-Feld entfernen



Seiten : [1] 2

Bratmaxxe
09-07-20, 13:16
Hallo zusammen,

gibt es eine einfache Möglichkeit alle ASCII Steuerzeichen / nicht druckbare Zeichen aus einem String zu entfernen?

Hintergrund - es kann wohl mal vorkommen, das via Zeichen aus Excel in die DB2 geschrieben werden, die nicht gewünscht sind.

Folgender Text steht in der Datenbank - dieser soll durch *BLANK ersetzt werden:
579

Wie finde ich überhaupt raus, um welches Zeichen es sich handelt?

Viele Grüße
Bratmaxxe

Robi
09-07-20, 13:42
Stichwort altes RPG
F in Stelle 53 der Headerkarte = Filetranslation

dann , am Pgm ende
** INPUT
XXYYxxyyXxYy... xx = der alte, yy der neue hex wert also z.b. 004001400240 ...




H .D F EGHEXR
F* ---------------------------------------------------------------------- *
F* HEXWERTE AUS Datei RAUS
F* ---------------------------------------------------------------------- *
FINPUT IP F 999 DISK
FOUTPUT O F 999 DISK A

IINPUT KF 01
I 1 250 S1
I 251 500 S2
I 501 750 S3
I 751 987 S4
OOUTPUT DADD 01
O S1 262
O S2 512
O S3 762
O S4 999
**
INPUT 00400140024003400440054006400740084009400A400B400C 400D400E400F40
INPUT 10401140124013401440154016401740184019401A401B401C 401D401E401F40
INPUT 20402140224023402440254026402740284029402A402B402C 402D402E402F40
INPUT 30403140324033403440354036403740384039403A403B403C 403D403E403F40
INPUT 4140424043404440454046404740484049404C40
INPUT 5140524053405440554056405740584059405E40
INPUT 624063406440654066406740684069406E40
INPUT 704071407240734074407540764077407840
INPUT 80408A408B408C408D408E408F40
INPUT 90409A409B409C409D409E409F40
INPUT A040AA40AB40AC40AD40AE40AF40
INPUT B040B140B240B340B440B540B640B740B840B940BA40BB40BC 40BD40BE40BF40
INPUT CA40CB40CC40CD40CE40CF40
INPUT DA40DB40DC40DD40DE40DF40
INPUT E140EA40EB40EC40ED40EE40EF40
INPUT FA40FB40FC40FD40FE40FF40


das ist RPG

Viel spass beim ILE / /Free umbau

Robi

malzusrex
09-07-20, 15:17
Jetzt mal soauf die Schnell und ungetestet


**FREE

ctl-opt dftactgrp(*no) main(main);

dcl-proc main;
dcl-s Text char(500) ;
Text = ClearString( Text );
end-proc;


dcl-proc ClearString ;
dcl-pi *N char( 500 );
$String char( 500 );
end-pi;

dcl-s Laenge int(10);
dcl-s Index int(10);
dcl-s Zeichen char(1);

for Index = 1 to %len( $String );
Zeichen = %SubSt( $String: Index: 1);
If Zeichen < x'40';
%SubSt( $String : Index: 1) = ' ';
endif;
endfor;

return $String;
end-proc;


Sollte alles was keiner BLANK ist, eben durch ein Blank ersetzen.

Gruß
Ronald

BenderD
09-07-20, 15:38
%xlate ist Dein Freund.

D*B

Fuerchau
09-07-20, 15:47
Geht auch mit SQL und TRANSLATE(Feld, '', x'000102030405...')

prsbrc
10-07-20, 06:30
Nur der Vollständigkeit halber: %SCANRPL oder SQL REPLACE könnte hier auch funktionieren.

Robi
10-07-20, 08:02
Alle genannten Möglichkeiten kenne ich natürlich auch.
'mein' Pgm hat den Vorteil, das es JEDE beliebige Datei, die aus Excel, TXT oder was auch immer, bereinigt.
ovrdbf input, ovrdbf output call fertig!
zu beachten, das ich eine Verschiebung von input zu output habe, da dieses Bsp ursprünglich für Sourcen gedacht war.
Wer also nicht immer für jede PC-Datei individuell die HEX-Müll entfernung codieren will ist damit gut bedient!
In diesem Sinne ...
Robi

Bratmaxxe
10-07-20, 08:28
Vielen Dank für Eure Hilfen - you saved my day !

VG
Bratmaxxe

B.Hauser
10-07-20, 09:15
Nachdem jetzt jeder seinen Senf dazugegeben hat, darf ich auch noch!
Wie wär's denn mit SQL und Regular Expressions?


Select RegexP_Replace(Text, '[\W+]', ' ')
from YourTable;


Birgitta

Fuerchau
10-07-20, 09:43
@Robi: Das funktioniert i.d.R. nur bei CPYFRMSTMF, da ich dann nur 1 Feld habe.
Bei CPYFRMIMPF muss ich da sowieso auf Feldebene arbeiten, da ist SQL dann einfacher.

@Birgitta:
In eckige Klammern braucht man nur Aufzählungen '[A-Za-z]' stellen, also '\W+' reicht da bereits.
Zu bedenken dabei ist: Alle Sonderzeichen "!§$%-_()..." fliegen dabei auch raus.
w = [A-Za-z0-9ÄÖÜäöüéáí....], also alle Buchstaben und Zahlen
W = Nicht w
Besser wäre da die Klasse [:cntrl:], also
Select RegexP_Replace(Text, '[:cntrl:]+', ' ') from yourtable

Zusätzlich muss RegEx auch noch als Systemoption installiert werden, was auf Kundensystemen häufiger nicht gemacht bzw. vergessen wird.