Datei öffnen, eine wert auslesen, handeln, neue Datei schreiben, starten

M

muemmi

Eroberer
hi

jetzt wird es zähfliesend!

ich müße ein für den profi kleines, aber für mcih großes programm schreiben!

wenn mir eine hilf mache ich es unter unix, ansonsten werde ich es mit Fortran (ja ich bin alt) machen denn das kann ich so einigermasen

ich muß eine datei öffnen, dann eine wert auslesen und danach entscheiden
bei "1" muß ich eine kleine datei schriben mit dessen hilfe ich mittesl ftp etwas lösche
dann muß ich die erste datei wieder öffnen und werte auslesen. dazu bräuchte ich noch die dateidaten, uhrzeit, datum und name ohne endung

uas all diesen werten mache ich eine input datei die ich dann in ein labordatensystem (Lims QLS) einlese

wenn mir einer helfen würde wäre das echt prima

er muß wohle nerven aus drahtseilen haben

liebe grüße

Frank müller
 
Das einfachste wäre, wenn Du ein konkretes Beispiel angibst, wie die Datei mit den Ausgangsdaten aussieht sowie wie die Input-Datei aussehen muss.

Gruss, Xanti
 
Okay

fangen wir mal an!

ich habe eine datei, dess namen steht in einer varaibeln drin!

z.b. so: c:/qls/qls/kln/1_105014.fax

zuerst brauche ich das datum die uhrzeit und den dateinamen davon und zwar in eine variable damit ich sie später weiter verarbeiten kann

in der ersten zeile steht eine 0 oder 1

wenn eine null drin steht fliegt sie auf den müll bei einer 1 muß ich weiterlesen

so sieht die datei aus

1
0
0
Betreff 024212222222 Nr 06-00840 , sent


Ich brauche nun noch der wert der 3 zeile
die telefonummer und die nummer 06... und den text hinter dem komma

aus all den daten wir dann folgene datei geschrieben
.DBI 1 FAXREP 1
.KEY "1_105014"
.DDI FAXMES 0 1 "sent"
.DDI FAXTEL 0 1 "024212222222 "
.DDI FAXZK2 0 1 "06-03062"
.DDI FAXDAT 0 1 "13.12.2006"
.DDI FAXZEI 0 1 "15:36"
.DDI FAXERR 0 1 "0"
.DDI FAXSYS 0 1 "TOBIT"
.DDI FAXKUN 0 1 &ZK2 06-03062 KBEZ
.DDI LTIME 0 1 @¹h:²m


die inversen felder sind die inhalte der variablen

so das war nun die einen datei

zusätzlich baruche ich noch eine datei

darim steht im prinzip nur das drin
**********************

user anonymous

delete 1_105014.$$$ <- dateiname aber mit dem $$$ am ende
quit
********************************

damit lösche ich dann die datei mittel FTP

ich hoffe ich hab alles

vorerst viele dank
 
Ok, mit perl wäre es eleganter und effizienter, da da nicht für jede Variable das File komplett geparst werden muss. Bei 4 Zeilen fällt das aber nicht ins Gewicht.

Code:
#!/bin/bash                                                                                              

if [ $(sed -n '1p' "$file") = "1" ]; then
    KEY=${file%\.fax}
    FAXDAT=$(stat -c "%z" "$file" | sed 's/^\(\w*\)-\(\w*\)-\(\w*\).*/\3.\2.\1/')
    FAXERR=$(sed -n '3p' "$file")
    FAXKUN=$(sed -n '4s/.*Nr \([0-9\-]*\).*/\1/p' "$file")
    FAXMES=$(sed -n '4s/.* \(\w*\)$/\1/p' "$file")
    FAXTEL=$(sed -n '4s/Betreff \(\w*\).*/\1/p' "$file")
    FAXZEI=$(stat -c "%z" "$file" | sed -n 's/.* \(\w*:\w*\):.*/\1/p')

    cat << EOF > "$KEY.input"                                                                            
.DBI 1 FAXREP 1                                                                                          
.KEY "$KEY"                                                                                              
.DDI FAXMES 0 1 "$FAXMES"                                                                                
.DDI FAXTEL 0 1 "$FAXTEL"                                                                                
.DDI FAXZK2 0 1 "$FAXKUN"                                                                               
.DDI FAXDAT 0 1 "$FAXDAT"                                                                                
.DDI FAXZEI 0 1 "$FAXZEI"                                                                                
.DDI FAXERR 0 1 "$FAXERR"                                                                                
.DDI FAXSYS 0 1 "TOBIT"                                                                                  
.DDI FAXKUN 0 1 &ZK2 $FAXKUN KBEZ                                                                        
.DDI LTIME 0 1 @¹h:²m                                                                                    
EOF                                                                                                      

    cat << EOF > "$KEY.ftp"                                                                              
**********************                                                                                   
                                                                                                         
user anonymous                                                                                           
                                                                                                         
delete $KEY.\$\$\$                                                                                       
quit                                                                                                     
********************************                                                                         
EOF                                                                                                      
fi

Die Variable, die den Filenamen enthält, heisst $file. Ausgabe ist in zwei Dateien $KEY.input und $KEY.ftp.

Gruss, Xanti
 
Zuletzt bearbeitet:
hupsss

das ging aber fix

ich probier es mal aus!

ähmmm

wo nimmst du die zeit nur her ?

du solltest dich bei unsere firma bewerben!
 
also nochmal

du machst das einfach prima

ich arbeite mitlerweile seit 16 jahren in der it
programiere immer wieder unter fortan und kenn sogar noch richtig betriebsysteme wie VMS

aber ich finde ganz toll wie du das alles so aus deinem gehirn kramst

ich versuche immer wieder die befehel zu analysieren

aber es ist recht schwirig

unter vms heißen diese skripte prozeduren und das kann ich gut

aber unix erstaunt mich immer wieder
 
hmmmm

hackt noch

auf der shell kommt folgene meldung!
qco/david_log3 29: <<EOF unclosed

ich hab auch den eindruck das er nicht in der if schleif reinkommt

ich hab hinter der esten variable eine echo gemacht und das zeigt er nicht

#!/bin/bash
export file='c:/qls/qls/kln/qsp/fax/log/1_111111.fax'

echo $file

if [ $(sed -n '1p' "$file") = "1" ]; then
KEY=${file%\.fax}
echo $key


was ist eigentlich mit der startsequenz : #!/bin/bash

muß die sein?

bei mir fängt das immer so an !:


#!/bin/sh


cd c:/qls/qls/kln
. ./kshrc # hole QLS-Environment
 
Erstmal muss ich sagen, dass Deine Problemstellung nicht wirklich kompliziert ist und eher eine Fleissaufgabe darstellt, die in einer viertel bis halben Stunde gelöst werden kann.

Code:
if [ $(sed -n '1p' "$file") = "1" ]; then
KEY=${file%\.fax}
echo $key

Unix ist case-sensitiv. Die Variable key ist eine andere als KEY, also muss da "echo $KEY" stehen.

Da Du, wie ich irgendwo gelesen habe, eine Unix-like-Umgebung hast, kann es auch gut sein, dass einige Bash-Sachen nicht funktionieren. Probier mal statt

Code:
cat << EOF > output
zeile 1
zeile 2
...
EOF

Code:
(echo zeile 1
echo zeile 2
) > output

#!/bin/bash ist die Shebang und legt den Interpreter für das Skript fest. Bei mir ist /bin/sh ein Link auf /bin/bash und damit ist #!/bin/bash gleichwertig mit #!/bin/sh. In einem normalen Mehr-Shell-Unixsystem bekommt man aber Schwierigkeiten damit, wenn man die Shell nicht explizit angibt.

btw, Du hast eine PM. ;)
 
ich bin was weiter!

es lag an vielen leerzeichen die ich beim kopieren mit genommen habe

er schreib jetzt eine datei

nur beide in eine

ich such noch was
 
so jetzt sieht es fast prima aus

in den vars FAXTEL und FAXMES ist nix drin !

warum auch immer

der "stat"befhle meckert er an! auch hier alles leer

in der ausgabe in der datei brauche ich nur den dateinamen ohne Pfad


hier wäre die doku für den befhel "stat" (für die wissenden)
 
Zuletzt bearbeitet:
hmmmm

merkwürdig

wenn ich den befehl "stat -c datei" ausführe sagt er stat not found

laut doku müßtes es ihn ja geben

könnte man mit ls nicht die info bekommen und dann den string auslesen?
 
FAXTEL und FAXMES: scheint ein Problem mit dem nicht erkannten blank zu sein. Ich ging davon aus, dass der Trenner ein Leerzeichen ist. Ersetz mal die beiden Zeilen

Code:
    FAXMES=$(sed -n '4s/.* \(\w*\)$/\1/p' "$file")
    FAXTEL=$(sed -n '4s/Betreff \(\w*\).*/\1/p' "$file")

durch

Code:
    FAXKUN=$(sed -n '4s/.*Nr[[:blank:]]\([0-9\-]*\).*/\1/p' $file)
    FAXMES=$(sed -n '4s/.*[[:blank:]]\(\w*\)$/\1/p' $file)

Damit werden sowohl Leerzeichen als auch Tabs erschlagen.

Bezüglich der stats: Man kann die Daten auch über ls -l ermitteln, vielleicht geht das einfacher:

Code:
   FAXDAT=$(ls -l $file | cut -d" " -f 7 | sed 's/^\(\w*\)-\(\w*\)-\(\w*\)/\3.\2.\1/')
   FAXZEI=$(ls -l $file | cut -d" " -f 8)
 
danke schön

ich probier das am montag aus und melde mich

liebe grüße

frank
 
hmmmm

also der erste punkt verwirrt mich

ich soll faxmes und tel

gegen kun und mess ersetzten ?

und das zweite klappt auch nicht zei und dat

ls -l gibt folgenes aus


-rwxrwxrwx 1 VORDEFINIERT\Administrators None 58 Dec 13 15:10
1_111111.fax
-rwxrwtrwa 1 VORDEFINIERT\Administrators None 74 Dec 19 09:24
1_111111.ftp
-rwxrwtrwa 1 VORDEFINIERT\Administrators None 274 Dec 19 09:24
1_111111.input

liebe grüße

frank
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

hier noch mal das ganze programm

#!/bin/sh
export file='c:/qls/qls/kln/qsp/fax/log/1_111111.fax'

echo $file

if [ $(sed -n '1p' "$file") = "1" ]; then
KEY=${file%\.fax}
echo $KEY
FAXERR=$(sed -n '3p' "$file")
echo Error $FAXERR

FAXTEL=$(sed -n '4s/Betreff \(\w*\).*/\1/p' "$file")
echo Tel: $FAXTEL

FAXKUN=$(sed -n '4s/.*Nr[[:blank:]]\([0-9\-]*\).*/\1/p' $file)
echo Nr: $FAXKUN

FAXMES=$(sed -n '4s/.*[[:blank:]]\(\w*\)$/\1/p' $file)
echo Meld: $FAXMES

FAXDAT=$(ls -l $file | cut -d" " -f 7 | sed 's/^\(\w*\)-\(\w*\)-\(\w*\)/\3.\2.\1/')
echo dat: $FAXDAT

FAXZEI=$(ls -l $file | cut -d" " -f 8)
echo Zeit: $FAXZEI

ls -l $file



cat << EOF > "$KEY.input"
.DBI 1 FAXREP 1
.KEY "$KEY"
.DDI FAXMES 0 1 "$FAXMES"
.DDI FAXTEL 0 1 "$FAXTEL"
.DDI FAXZK2 0 1 "$FAXKUN"
.DDI FAXDAT 0 1 "$FAXDAT"
.DDI FAXZEI 0 1 "$FAXZEI"
.DDI FAXERR 0 1 "$FAXERR"
.DDI FAXSYS 0 1 "TOBIT"
.DDI FAXKUN 0 1 &ZK2 $FAXKUN KBEZ
.DDI LTIME 0 1 @¹h:²m
EOF

cat << EOF > "$KEY.ftp"
user anonymous

delete $KEY.\$\$\$

quit
EOF

fi


und die datei: ($file)
----------------------------------------------
1
0
7
Betreff 003235685293 Nr 06-03052 , sent
----------------------------------------------

die nummer und den error findet er
 
Zuletzt bearbeitet:
Hallo
Es handelt sich hier nicht um eine Unix-shell!
Cygwin oder was auch immer du verwendest, ist nicht kompatibel zu einer bash oder ksh!
Folglich ist das hier eigentlich OT!
Ich möcht aber dennoch einen Tipp geben, obwohl ich eigentlich auf Windows nicht reagiere:
Das ls -l findet das Datum nur dann zuverlässig, wenn im Pfad oder Dateiname kein Leerzeichen vorkommt!

Du kannst aber versuchen mit sed das von Hinten aufzufädeln:
Wenn die Ausgabe deines ls -l so ausschaut:

Code:
-rwxrwxrwx 1 VORDEFINIERT\Administrators None 58 Dec 13 15:10 1_111111.fax
-rwxrwtrwa 1 VORDEFINIERT\Administrators None 74 Dec 19 09:24 1_111111.ftp
-rwxrwtrwa 1 VORDEFINIERT\Administrators None 274 Dec 19 09:24 1_111111.input
Dann liefert:
Code:
ls -l |sed -e 's|^.*[[:blank:]]\(\w\+[[:blank:]]\+[[:digit:]]\+\)[[:blank:]]\([[:digit:]]\+:\+[[:digit:]]\+\)[[:blank:]]\([^:]\+\)$|\1|g'
Dec 13
Dec 19
Dec 19
#sprich das Datum
ls -l |sed -e 's|^.*[[:blank:]]\(\w\+[[:blank:]]\+[[:digit:]]\+\)[[:blank:]]\([[:digit:]]\+:\+[[:digit:]]\+\)[[:blank:]]\([^:]\+\)$|\2|g'
15:10
09:24
09:24
# die Uhrzeit.
Das jetzt in deiner Variable verheizt, und du solltest das bekommen was du willst.

Gruß Wolfgang
 
hallo wolfgang!

ich bin ein opfer!

man hat es mir aufgezwungen

es ist grundsätzlich ein unix-system, welches man auf kunden wunsch auf windows portiert hat

aber man hat folgenes gemacht, man hat das system auf eine unix shell die auf windows läuft gesetzt

das teil heißt mks toolkit und es arbeitet mit fast allen unix comandos

hier der link

http://www.kessler.de/prd/mks/p_toolkit_befehle.htm

ich werde es mal probieren
 
Hallo
Versteh das bitte nicht falsch.
Mir ist es grundsätzlich egal, wer was benutzt.
Nur in diesem Board geht es um *nix-shell!
Irgendwelche Derivate sind mitnichten kompatibel, und deshalb hat es keinen Sinn hier darüber zu debattieren.

Das kannst du ja schon an deinem Problem mit stat erkennen.
Ich persönlich habe weder die Möglichkeit, noch die Lust meine Vorschläge und Hilfen Windows-kompatible zu gestalten.

Viel Glück
Gruß Wolfgang
 
Hi XANTI

es läuft fast alles nur die beiden variablen werden noch nicht gefüllt

FAXKUN=$(sed -n '4s/.*Nr[[:blank]\([0-9\-]*\).*/\1/p' $file)
echo Nr: $FAXKUN

FAXMES=$(sed -n '4s/.*[[:blank]\(\w*\)$/\1/p' $file)
echo Meld: $FAXMES

interssanterweise diese

FAXKUN=$(sed -n '4s/.*Nr[[:blank]\([0-9\-]*\).*/\1/p' $file)
echo Nr: $FAXKUN

tut es obwohl sei aus den selben zeile ließt

grüße

frank
 
Deine blank-Klasse ist nicht richtig, sie muss [[:blank:]] lauten. Weiterhin sehe ich keinen Unterschied zwischen der funktionierenden und der nicht-funktionierenden FAXKUN-Zeile.

Gruss, Xanti
 
sorry

ein übertragungsfehler

so sieht es in emienm prog aus


FAXTEL=$(sed -n '4s/Betreff \(\w*\).*/\1/p' "$file")
echo Tel: $FAXTEL

FAXKUN=$(sed -n '4s/.*Nr[[:blank:]]\([0-9\-]*\).*/\1/p' $file)
echo Nr: $FAXKUN

FAXMES=$(sed -n '4s/.*[[:blank:]]\(\w*\)$/\1/p' $file)
echo Meld: $FAXMES


FAXKUN ist ok, die beiden anderen nicht

und so sieht die vierte zeile in der input datei aus

Betreff 003235643757 Nr 06-03052 , sent


ps: aus den zeichen macht der editot eine smilie
 

Ähnliche Themen

Werte aus text datei auslesen in Rtf template schreiben

Zurück
Oben