delphin66
Goto Top

Versch. Grossbuchstaben aus File auslesen und abspeichern

Moin freunde

ich habe folgendes textfile, dass jeden tag erneuert wird. (altes wird überschrieben)
Inhalt:

EMM1
Volume in Laufwerk O: hat keine Bezeichnung.
Volumeseriennummer: 6006-E9A7
(Leerzeile)
Verzeichnis von o:\programme\ceessar
(Leerzeile)
05.03.2009 11:40 297'607'168 Offline.mdb
1 Datei(en) 297'607'168 Bytes
0 Verzeichnis(se), 72'073'424 Bytes frei
(Leerzeile)
LUZ1
(hier fängt es wieder von vorne an)


Ich frage jeden Tag in den Geschäftern ab (sind 67 Stück), ob die Offlinedb aktuell ist.
Für mich relevant sind folgende Einträge:
EMM1 (ist der Kürzel der Filiale)
05.03.2009 297'607'168 (Datum und die Grösse. Die Zeit wie auch der Name sind nicht wichtig)

Der andere "Müll" brauche ich nicht.
Das neu generierte Textfile sollte nun so aussehen:

EMM1, 05.03.2009, 297607168
LUZ1, in dem Stil weiter bis alle Filialen ausgelesen sind

Somit kann ich diese Daten in ein Excel-Sheet einfügen und sehe immer genau, in welcher Filiale die OfflineDB nicht erstellt worden ist.

Noch wichtig zum wissen:
Sollte eine Filiale nicht erreichabr sein, erscheint nur das Kürzel bsp. EMM1 und direkt unterhalb beginnt der nächste Kürzel bsp. LUZ1
Die Kürzel sind immer Grossbuchstaben mit einer Zahl. Die Zahlen gehen bis max. 4, also EMM1, EMM2, EMM3 etc

Ich wäre froh, wenn mir jmd. helfen könnte

Content-ID: 111082

Url: https://administrator.de/forum/versch-grossbuchstaben-aus-file-auslesen-und-abspeichern-111082.html

Ausgedruckt am: 23.12.2024 um 15:12 Uhr

maretz
maretz 11.03.2009 um 10:40:20 Uhr
Goto Top
Moin,

ich hab leider grad keine Zeit das komplette Script zu schreiben - aber mit Perl sollte das ne kleinigkeit sein... Zuerst die Datei einlesen, in einen grossen Array packen und dann jede Zeile des Arrays prüfen ob diese mit ^[A-Z](3) anfängt:
^ -> Prüft ob eine Zeile damit anfängt
[A-Z] ist das Pattern wonach du suchst (Alle buchstaben zwischen A-Z als grossbuchstaben)
(3) (oder {3}) sagt das das Pattern 3x vorkommen muss.

Wenn ja - dann die gefundene Zeile Zeichen 1-4 ausgeben und nen zweites Regex aufbauen: Beginnt die Zeile mit [0-9][0-9]\.[0-9][0-9]\.[0-9][0-9][0-9][0-9] (\. weil nur ein . ein universeller platzhalter ist!) dann diese auch rausschreiben.

Damit sollte das dann schon laufen - die Ausgabe noch etwas in schön formatieren und du hast gleich ne csv-Datei erstellt face-smile
delphin66
delphin66 11.03.2009 um 11:20:03 Uhr
Goto Top
Hi maretz
danke dir mal für deine schnelle antwort.

ich hatte gedacht, ich könnte das teil in einem batch starten, also relativ simple. Nun kommst du mit Perl!?!? Damit kann ich leider überhaupt nichts anfangen.
Brauche ich dazu etwas installieren?
Sry, dumme Frage aber ich versteh da nur Bahnhof.

nachtrag:

ich habe einen batch geschrieben offlinebd.cmd

ich mache zuerst ein net use in die filialen und
frage nachher mit
dir o:\programme\ceessar\offline.mdb >> offlinebd.txt

die daten ab.
maretz
maretz 11.03.2009 um 11:41:41 Uhr
Goto Top
Perl ist eine Script-Programmiersprache ... Dafür müsstest du dann den Interpreter installieren - ist freie Software...

Allerdings: Wenn du die Daten praktisch aus einer grossen "Hauptdatenbank" nur in eine lokale Offline-DB packst dann ist die Frage -> kannst du dem Tool was die Daten kopiert nicht einfach am Ende sagen das es dir z.B. eine Mail schicken soll bzw. das es den Status der Kopie in eine entsprechende Tabelle zurückschreibt?

Ich stelle mir das so vor: Du hast ein Script was mit

select .... die ganzen daten aus der quell-DB holt und dann mit "insert" in deine offline-kopie einträgt. Ganz am Ende deines Scriptes machst du dann auf die Quell-DB ein
insert "<standortname>",<datum> into kopiestatus
schon hättest du in deiner Datenbank automatisch die nötigen Einträge - und kannst genau sehen wann deine Offline-Kopie das letzte mal lief...
delphin66
delphin66 11.03.2009 um 12:03:50 Uhr
Goto Top
Hi maretz

ups, da haben wir uns falsch verstanden.

ich sitze im "hauptquartier" und betreue über 60 filialen. in den filialen gibt es kassen (registriekassen, 1, 2 oder bis zu 4 stück). dort läuft ein sql-server, der immer um mitternacht von der sql-datenbank eine access datenbank erzeugt und in einem folder ablegt. sollte der sql-server abrauchen, so wird automatisch auf die offlinedb ( ms access) geschaltet und der betrieb kann weiter laufen.
jetzt habe ich die aufgabe, die offlinedb auf grösse und aktualität zu kontrollieren. die grösse ist auch entscheident, weil die könnte ja während dem kopiervorgang abgebrochen sein.
in einem späteren arbeitsschritt möchte ich dann dieses file in ein excel - sheet importieren das dan folgendermassen aussieht:

Filial Kürzel, Datum, Grösse
EMM1, 05.03.2009, 278876234
EMM2, 05.03.2009, 280234762 (die grösse der DB kann ja wenig varieren)
EMM3 ** (Wenn kein datum steht, weiss ich sofort, dass die Verbindung in diese Filiale nicht funktioniert hatte oder die Kasse nicht läuft)
EMM4, 05.03.2009, 290234652
LUZ1 (so weiter bis alle 60 filialen abgearbeitet worden sind)
miniversum
miniversum 11.03.2009 um 13:06:41 Uhr
Goto Top
Versuch es mal damit (ungetestet):
@echo off
set "outline="  
set "linenr=0"  
set "infile=C:\alles.txt"  
set "outfile=C:\gefiltert.csv"  

echo Filial Kürzel, Datum, Grösse>"%outfile%"  
FOR /F "tokens=1,* delims=:" %%i in ('findstr /n .* "%infile%"') do call:verarbeite "%%i" "%%j"  
goto:eof

:verarbeite
set /a linenr+=1
set "line=%~2"  

if "%linenr%" equ "1" set "outline=%line%"  
if "%linenr%" equ "2" if "%line:~0,18%" equ "Volume in Laufwerk" (echo %outline% **>>%outfile% & set "linenr=0")  
if "%linenr%" equ "7" FOR /F "tokens=1,3 delims= " %%l in ('echo %line%') do echo %outline%, %%l, %%m >>%outfile%  
if "%linenr%" equ "10" set "linenr=0"  
goto:eof
delphin66
delphin66 11.03.2009 um 13:34:15 Uhr
Goto Top
Hi miniversum

danke für deine antwort.
ich habe infile und outfile meinem pfad angepasst.

ich erhalte zwar eine csv, darin steht aber nur
Filial Kürzel, Datum, Grösse

ich habe keine Einträge
EMM1 05.03.2009 etc... face-sad
miniversum
miniversum 11.03.2009 um 18:51:00 Uhr
Goto Top
Habs jetzt angetestet udn so gehts:
@echo off
set "outline="  
set "linenr=0"  
set "infile=alles.txt"  
set "outfile=gefiltert.csv"  

echo Filial Kürzel, Datum, Grösse>"%outfile%"  
FOR /F "tokens=1,* delims=:" %%i in ('findstr /n .* "%infile%"') do set "line=%%j" & call:verarbeite "%%i" "%%j"  
goto:eof

:verarbeite
set /a linenr+=1
if "%linenr%" equ "10" set "linenr=0"  
if "%line%" equ "" goto:eof  
set "line=%line:)=%"  
set "line=%line:(=%"  

if "%linenr%" equ "1" set "outline=%line%"  
if "%linenr%" equ "2" if "%line:~0,18%" neq "Volume in Laufwerk" (  
  echo %outline% **>>"%outfile%"  
  set "linenr=0"  
)
set "line=%line:'= %"  
if "%linenr%" equ "7" FOR /F "tokens=1,3,4,5 delims= " %%l in ('echo %line%') do echo %outline%, %%l, %%m^'%%n^'%%o >>"%outfile%"  
goto:eof
delphin66
delphin66 11.03.2009 um 20:05:51 Uhr
Goto Top
hi miniversum

ich danke dir für das "neue" script. ich werde dies als erstes nach dem morgendlichen Kaffee testen face-smile
und dir berichten.

nice evening and thx
delphin66
delphin66 12.03.2009 um 09:07:11 Uhr
Goto Top
Guten Morgen

habe es soeben getestet, es stimmt nicht ganz:

hier mein input file
snipp

EMM1
Volume in Laufwerk O: hat keine Bezeichnung.
Volumeseriennummer: 6006-E9A7

Verzeichnis von o:\programme\ceessar

11.03.2009 11:48 298'262'528 Offline.mdb
1 Datei(en) 298'262'528 Bytes
0 Verzeichnis(se), 72'050'561'024 Bytes frei
EMM2
Volume in Laufwerk O: hat keine Bezeichnung.
Volumeseriennummer: 6006-E9A7

Verzeichnis von o:\programme\ceessar

11.03.2009 00:12 298'262'528 Offline.mdb
1 Datei(en) 298'262'528 Bytes
0 Verzeichnis(se), 73'166'266'368 Bytes frei
LUZ1
Volume in Laufwerk O: hat keine Bezeichnung.
Volumeseriennummer: 6006-E9A7

Verzeichnis von o:\programme\ceessar

11.03.2009 11:45 298'262'528 Offline.mdb
1 Datei(en) 298'262'528 Bytes
0 Verzeichnis(se), 72'066'781'184 Bytes frei


snapp
und so geht es weiter bis alle filialen durch sind (es sind 60 filialen mit 2 oder mehreren kassen)

und so sollte das outpufile aussehen (in Tabellen im Excel)

snipp

Filiale-Kürzel Datum Grösse
EMM1 11.03.2009 298'262'528
EMM2 11.03.2009 298'262'528
LUZ1 11.03.2009 298'262'528

snapp


es kann sein, dass eine filiale nicht antwortet (ADSL-Leitung down, oder die Kasse wurde abgestellt) dann sieht das ganze so aus:

snipp

EMM1
Volume in Laufwerk O: hat keine Bezeichnung.
Volumeseriennummer: 6006-E9A7

Verzeichnis von o:\programme\ceessar

11.03.2009 11:48 298'262'528 Offline.mdb
1 Datei(en) 298'262'528 Bytes
0 Verzeichnis(se), 72'050'561'024 Bytes frei
EMM2
LUZ1
Volume in Laufwerk O: hat keine Bezeichnung.
Volumeseriennummer: 6006-E9A7

Verzeichnis von o:\programme\ceessar

11.03.2009 11:45 298'262'528 Offline.mdb
1 Datei(en) 298'262'528 Bytes
0 Verzeichnis(se), 72'066'781'184 Bytes frei
snapp

wie du siehst , bekam ich von EMM2 keine info (also kasse abgestellt oder leitung down)
in diesem fall sollte im outpufile nur der eintrag
EMM2
stehen, also ohne datum und grösse. so kann ich auf die schnelle sehen, das da etwas schiefgelaufen ist.


danke dir (euch) für antworten
Biber
Biber 12.03.2009 um 10:16:02 Uhr
Goto Top
Moin delphin66 ,

Willkommen im Forum.
Und natürlich Moin miniversum.

hier wäre ein Alternativschnipsel:

::-------DailyBranches.cmd
@echo off & setlocal
:: variable für "Letzte gelesene Filiale"  
Set "LastReadBranch="  
Set "inFile=D:\Filialen\DailyImport.txt"  
Set "OutFile=con:"  
FOR /f "Tokens=1,3" %%i in ('findstr /v "^$ ( Volume Verzeichnis" %inFile%') do (  
    Call :processLine %%i %%j
)
goto :eof

:processLine entweder nur %1=Filiale oder %1 %2 Datum Größe
If "%~2"=="" (  
    If NOT "%LastReadBranch%" == "" Echo %LastReadBranch% --keine Daten-- >>%OutFile%  
    Set "LastReadBranch=%1"  
    Goto :eof
)
::--- else-Fall ... Parameter %2 (FileSize) ist dabei
  Set "theSize=%2"  
  Set "TheSize=%theSize:'=%"  
  >>%outFile% Echo %LastReadBranch% %1 %TheSize%
  Set "LastReadbranch="  
goto :eof  

Den Pfad zu Deinem "%InFile%" und "%outfile% bitte anpassen.

Grüße
Biber
[Edit] Korrektur %1 (Datum) in :processline ergänzt. (s.u. ) [/Edit]
delphin66
delphin66 12.03.2009 um 10:35:34 Uhr
Goto Top
Hallo Biber

::-------DailyBranches.cmd
@echo off & setlocal
:: variable für "Letzte gelesene Filliale" und "neue Filial-Sequenz"
Set "LastReadBranch="
Set "inFile=H:\support\offlinedb\pos_exe.txt"
Set "OutFile=H:\support\offlindb\posneu.txt"
FOR /f "Tokens=1,3" %%i in ('findstr /v "^$ ( Volume Verzeichnis" %inFile%') do (
Call :processLine %%i %%j
)
goto :eof

:processLine entweder nur %1=Filiale oder %1 %2 Datum Größe
If "%~2"=="" (
If NOT "%LastReadBranch%" == "" Echo %LastReadBranch% --keine Daten-- >>%OutFile%
Set "LastReadBranch=%1"
Goto :eof
)
::--- else-Fall ... Parameter %2 (FileSize) ist dabei
Set "theSize=%2"
Set "TheSize=%theSize:'=%"
>>%outFile% Echo %LastReadBranch% %1 %TheSize%
Set "LastReadbranch="
goto :eof


Habe das in - und output file angepasst, den batch laufen lassen, und es kam folgende fe^hlermeldung:
das System kann den angegebenen Pfad nicht finden

face-sad
delphin66
delphin66 12.03.2009 um 10:38:16 Uhr
Goto Top
Sry Biber, war etwas zu voreilig

script funktioniert, jedoch wäre ich froh, wenn ich das datum noch drinnen hätte

danke dir
Biber
Biber 12.03.2009 um 10:55:44 Uhr
Goto Top
Moin delphin66,

sorry, hatte den Parameter 1 in diesem Statement unterschlagen.
Echo %LastReadBranch% %1 %TheSize%

Ist oben angepasst.

Grüße
Biber
delphin66
delphin66 12.03.2009 um 11:31:07 Uhr
Goto Top
Biber und miniversum

Jungs, ihr seit SPITZE

Betsen Dank und grüsse