OS2.org Site Index - Feedback - Impressum
Sprachauswahl / Choose your Language News Software Hardware Projekte Forum Tipps Links Verschiedenes
Editorial Diskussion HelpDesk Umfrage
[Forum]
in nach (Erweiterte Suche)
[Forum]
( Archiv ) ( Neues Thema )

( Zeige die Threadübersicht ) ( Zur Startübersicht )
07.06.2004
REXX Programm (von: Manfred, 13:28:09) ^
Hallo zusammen,
ich habe eine DB2-Downloaddatei vorliegen.
Innerhalb dieser Datei sind die einzelnen Felder mit Kommas getrennt. Textfelder sind zusätzlich mit Hochkommans umrandet. Die einzelne Zeile ist 1865 Zeichen lang. Hier einen Auszug: ,"15.09.27",19800101,"00.00.00",19800101,"00.00.00"

Nun soll ich ein Programm schreiben mit folgender Funktion: eine Zeile auslesen, Kommas sowie Hochkommas löschen. Das Ergebnis in eine Datei schreiben. Hier darf die Zeile dann nur noch 512 Zeichen lang sein. Wobei das 512'te Zeichen ein @ ist.
Nun habe ich das Auslesen der Datei realisiert. Das Schreiben der ersten 512 Zeichen, einschließlich des @ funktioniert ebenfalls.
Die nächsten 512 Zeichen schreibt das Programm in die gleiche Zeile.

Wie bekomme ich einen Zeilenumbruch hin?
Sodaß die nächsten 512 Zeichen un die nächste Zeile geschrieben werde.
[ Leser: 85 ]

Re: REXX Programm (von: Th. Beke, 14:23:07)
Hi Manfred, wie machst du denn deinen Output?

ich würde die korrigierte Eingabezeile mit der Funktion SUBSTR auf die erforderliche Länge des Ausgabestrings trimmen, und dann mit LINEOUT wegschreiben. Diese Funktion macht den 'Zeilenumbruch' automatisch.

Gruss, Thomas

Re: REXX Programm (von: Manfred, 15:13:01)
Hallo Thomas,

vielen Dank für den Hinweis.
Bisher habe ich zeichenweise eingelesen und in eine Compoundvariable umgeleitet.
Dann habe ich das @ mit INSERT an die 512'te Stelle angehängt. Anschließend habe ich zeichenweise in die Datei schreiben lassen.

Für die Funktion SUBSTR sollte ich wohl ohne Compound Variable arbeiten. Ich versuche dann morgen mal zeichenweise einzulesen und benötigte Zeichen mit INSERT in eine Stringvariable umzuleiten. Wenn das funktioniert kann ich mit SUBSTR die Stringvariable bearbeiten.

Bis dann
Manfred

08.06.2004
Re: REXX Programm (von: Th. Belke, 10:37:57)
Hallo Manfred,

> ... eine DB2-Downloaddatei ... Die einzelne Zeile ist 1865 Zeichen lang.
ist die Quelldatei eigentlich eine *.dbf? Wenn du eigentlich eine Textdatei als Quelle für die Umformung benutzt, dann könntest du auch die Funktion LINEIN verwenden, statt mit einer Schleife zeichenweise einzulesen. Danach vielleicht ein TRANSLATE, um die unerwünschten Zeichen zu eliminieren, dann mit SUBSTR auf die erforderliche Zeilenlänge (511 Zeichen) der Ausgabedatei kürzen und das '@' anhängen. Schließlich mit LINEOUT zeilenweise in die Ausgabedatei ausgeben. Mit der Funktion LINES wird geprüft, ob in der Quelldatei noch Sätze sind.

Wenn du aber zeichenweise einliest, böte es sich auch an, jedes Zeichen gleich an eine Variable anzuhängen, sofern es nicht eines der unerwünschten ist. Die angehängten Zeichen werden gezählt, indem jedesmal ein Zähler hochgezählt wird, der die Schleife nach dem 511. Zeichen unterbricht, dann wird ein '@' angehängt, mit LINEOUT ausgegeben und von vorn begonnen.

... ist mir gerade so durch den Kopf gegangen, vielleicht kannst du's ja als Anregungung gebrauchen?

Gruss, Thomas

Re: REXX Programm (13:35:47)
Hallo
Anstelle von @ die Zeichenvollge @ CR LF schreiben. CR= C..(13) jetzt weiss ich leider den Befehl nicht auswendig der eine Zahl in ein ASCII Zeichen umwandelt
Also
Insert '@'
insert CR
insert LF

Re: REXX Programm (von: manfred, 14:46:43)
Hallo Thomas,

aufgrund Deines Tip von gestern bin ich zu einem Lösungsansatz gekommen vergleichbar mit Deinem zweiten Vorschlag von heute.
Ich lese also Zeichen für Zeichen ein. Die Zeichen, die ich benötige lasse ich an eine Variable anhängen. Das das geht und wie das geht, habe ich heute morgen gelernt.
Hier ein Auszug meines Programms:
DO bookmark=1 TO 1855
tmp=CHARIN("FHLOTDB.TXT", bookmark, 1 );
IF tmp \== '"' & tmp \== ',' THEN DO
characternumber = characternumber+1;
IF characternumber =1 THEN
line.1=tmp;
ELSE DO
IF characternumber < 511 THEN DO
IF characternumber =79 THEN DO
line.1=line.1||' ';
line.1=line.1||tmp;
END;
ELSE
line.1=line.1||tmp;
END;
END;
END;
END;

Anschließend hänge ich das @ hinten an. Dann lasse ich mit LENGTH() die Länge feststellen, zur Kontrolle und weil die letzte Zeile nicht ganze 512 Zeichen lang ist. Mit SUBSTRG() schneide ich die Variable dann noch mal auf die vorher festgestellte Länge. So erhalte ich den Zeilenumbruch. Dann schiebe ich den ganzen String in die Ausgabedatei.
Hier ein weiteres Beispiel:
line.1=line.1||at_sign;
linelength.1=LENGTH(line.1)
SAY 'Die Laenge der Variable line.'1' betraegt: 'linelength.1;
outputline.1=SUBSTR(line.1, 1, linelength.1);
outputlinelength.1=LENGTH(outputline.1);
SAY 'Die Laenge der Variable outputline.'1' betraegt: 'outputlinelength.1;
tmp=LINEOUT("FDLOTDB.TXT", outputline.1);

Das funktioniert wunderbar.

Die Quelldatei ist leider keine echte dbf Datei. Die Quelldatei ist eine CSV Datei. Dein Vorschlag mit dem Translate teste ich aus.

( Zeige die Threadübersicht ) [ Version zum Drucken ] ( Zur Startübersicht )

Datum Thema
09.01.2017 *

*

Name: * eMail: Benachrichtigung

Mit * markierte Felder müssen ausgefüllt werden !


php.net OpenIT © 1998-2017 by WebTeam OS2.org