giuseppe0706
Goto Top

Inhalt von Textdatei per Routine ändern

Hi Leute!

Folgendes Problem plagt mich schon seit einiger Zeit und ich finde keine Lösung.

Ich bekomme von einer Abrechnungsfirma jeden Monat eine Textdatei mit folgendem Inhalt:

aaaa.bbbb.cccc.xxx

Da es leider jeden Monat zu differenzen kommt muss ich diese vor der Übernahme in mein
Buchhaltungsprogramm manuell in der Textdatei wie folgt korrigieren:

Beispiel:

1234.5678.0815.915
1234.5678.0815.916

Wenn als letzter Wert 916 angegeben ist, müsste für die Übernahme der Wert der 2. "Spalte"
nicht 5678 sondern 3364 lauten.
Somit also korrigiert

1234.5678.0815.915
1234.3364.0815.916

Jetz seid Ihr gefragt!
Ich habe bereits versucht die txt-Datei nach Excel zu übernehmen und mit der Formel =wenn;dann;sonst
so abzuändern, dass ich die gewünschten Werte erhalte.
Dazu muss ich aber jedes Mal die txt-Datei nach Excel importieren und bearbeiten.
Da mir diese Prozedur aber auf Dauer zu müßig ist, bin ich nun auf der Suche nach einer
Idee für eine Routine die mir das ganze wie gewünscht umsetzt.
Ich hoffe Ihr könnt mir dabei helfen.

Besten Dank im Voraus!

Content-Key: 42773

Url: https://administrator.de/contentid/42773

Printed on: April 19, 2024 at 03:04 o'clock

Member: Biber
Biber Oct 23, 2006 at 07:25:35 (UTC)
Goto Top
Moin guiseppe0706,

dann lass doch einen Einzeiler vom CMD-Prompt drüberschrubbeln,
>for /f "tokens=1-4 delims=." %a in (c:\input\monatssdatei.txt) do @if %d==916 @(echo %a.3364.%c.%d) else echo %a.%b.%c.%d >>c:\input\monatsdatei_korr.txt  

[ Du kannst ja erstmal die Umleititung in Datei (">>c:\input\monatsdatei_korr.txt") weglassen zum Test.
Und wenn es noch mehr Regeln gibt, würde sich eventuell eine Batchdatei lohnen... kann ich nicht einschätzen. ]

Gruß
Biber
Member: giuseppe0706
giuseppe0706 Oct 23, 2006 at 09:52:43 (UTC)
Goto Top
Hi Biber,

Erstmal vielen Dank für die prompte Antwort.

ne batch-Datei wär sicher von Vorteil, da die Datei ja jeden Monat kommt und auch verschiedene Umsetzregeln enthält.
Ich hätte besser eine komplette Zeile einstellen sollen, da ich trotz meines nur bescheidenen Wissens glaube erkannt zu haben, dass der Ausdruck "tokens=1-4 delims=." eine Trennung der Abschnitte durch Punkte bezeichnet. Das ist jedoch leider nicht für jeden Abschnitt der Fall.
Meistens kommt überhaupt keine Trennung zum Einsatz. Nur im Vorderen Teil der jeweiligen Zeilne findet eine Abtrennung durch Punkte statt.
Hier noch ein konkretes Beispiel:

16653300119.00815.01234.7001006000000002900+16653300000070061030BESFS010 24006101303 UMLAGE 06

In dieser Zeile wäre aufgrund der Zahlenkombination 240 an den Stellen 77-79 die 01234 gegen 05678 auszutauschen.
Member: Biber
Biber Oct 23, 2006 at 10:04:16 (UTC)
Goto Top
Na ja, guiseppe0706,

ein wenig verfeinern lässt sich das ja schon - ich habe auch schon Bätche mit 3 oder noch mehr Zeilen geschrieben.

Wichtig ist ja nur, dass automatisiert abprüfbare Kriterien definierbar sind, die einen Batchablauf ohne Benutzerinteraktion ermöglichen.

Lassen sich denn die definieren?
Oder konkret: Gilt denn immer: wenn Stellen 76 bis 79 = Leerzeichen+"240", dann ersetze von den ersten drei durch Punkt getrennten Satz-Teilen das dritte durch Was-auch-immer?

Wenn ja, dann lässt es sich alles lösen...

Gruß
Biber
Member: giuseppe0706
giuseppe0706 Oct 23, 2006 at 17:29:49 (UTC)
Goto Top
Hi Biber,

im Prinzip läuft das immer nach dem gleichen Schema ab, ja.
Es gibt natürlich deutlich mehr Kombinationen.
z.B.
wenn 240 dann 05678
wenn 250 dann 00815
wenn 260 dann ...
etc

Aber da wird eben immer nur ein Wert aus einem durch die Punkte abgetrennten Felder ersetzt.

Wäre echt dankbar wenn du mir dabei helfen könntest das Problem zu lösen.

Ciao Giuseppe
Member: Biber
Biber Oct 23, 2006 at 17:52:05 (UTC)
Goto Top
Na guiseppe,

dann poste doch mal 10 reale (oder vom Aufbau her wirklichsnahe) Zeilen und spezifizier die Regeln... einen oder zwei Kaffee lang bin ich noch hier...

Ach ja, so drei, vier Zeilen sollten den genannten Kriterien entsprechen..*gg

Gruß
Biber
Member: giuseppe0706
giuseppe0706 Oct 23, 2006 at 20:52:13 (UTC)
Goto Top
Die Realität darf ich leider nicht darstellen.
So sieht´s dann aus wenn´s der Wirklichkteit recht nahe kommt.

16653300aaa.bbbbb.ccccc.7001006000000002568+16653300000070061030BESFS010 xxx06101303 UMLAGE 06

16653300115.00815.01234.7001006000000002568+16653300000070061030BESFS010 28006101303 UMLAGE 06
16653300119.00815.01234.7001006000000002620+16653300000070061030BESFS010 24006101303 UMLAGE 06
16653300116.06250.01234.7001006000000003800+16653300000070061030BESFS010 25006101303 Beitrag06
16653300118.03970.01234.7001006000000008723+16653300000070061030BESFS010 24006101303 ZULAGE 06
16653300113.03980.01234.7001006000000007469+16653300000070061030BESFS010 26006101303 Beitrag06
...

Meistens sind es so ca. 75-100 Datensätze


folgendes sollte nun passieren:
wenn xxx = 240 dann c = 05270
wenn xxx = 250 dann c = 05280
wenn xxx = 260 dann b = 06240
wenn xxx = 280 dann a = 113
etc.
Member: Biber
Biber Oct 24, 2006 at 07:28:50 (UTC)
Goto Top
Moin Guiseppe,

dann wäre das eine erste Skizze:

:: ---snipp guiseppe.bat---------
@echo off
REM Am Anfang nehme ich eine komplette Zeile so wie sie ist...
For /f "delims=" %%i in (\Administrator\guiseppe.txt) do call :processThisLine %%i  
goto :eof     


:processThisLine [Parameter ist eine Zeile aus der Inputdatei
 set "thisline=%*"  
 set "theCase=%thisline:~73,3%" & set "first8Chars=%thisline:~0,8%"  
 ::echo %theCase%
 if [%theCase%]==[240] For /f "tokens=1-3,* delims=." %%a in ("%ThisLine%") do @(echo %%a.%%b.05270.%%d) & goto :eof  
 if [%theCase%]==[250] For /f "tokens=1-3,* delims=." %%a in ("%ThisLine%") do @(echo %%a.%%b.05280.%%d) & goto :eof  
 if [%theCase%]==[260] For /f "tokens=1-3,* delims=." %%a in ("%ThisLine%") do @(echo %%a.06240.%%c.%%d) & goto :eof  
 if [%theCase%]==[280] For /f "tokens=1-3,* delims=." %%a in ("%ThisLine%") do @(echo %first8Chars%113.%%b.%%c.%%d) & goto :eof  
 echo %thisline%
 goto :eof
::--------snapp guiseppe.bat 

Demo des Schnipsels am CMD-Prompt:
(= 9:22:33  F:\=)
>type Administrator\guiseppe.txt
16653300115.00815.01234.7001006000000002568+16653300000070061030BESFS010 28006101303 UMLAGE 06
16653300119.00815.01234.7001006000000002620+16653300000070061030BESFS010 24006101303 UMLAGE 06
16653300116.06250.01234.7001006000000003800+16653300000070061030BESFS010 25006101303 Beitrag06
16653300118.03970.01234.7001006000000008723+16653300000070061030BESFS010 24006101303 ZULAGE 06
16653300113.03980.01234.7001006000000007469+16653300000070061030BESFS010 26006101303 Beitrag06

(= 9:24:53  F:\=)
>Administrator\guiseppe.bat
16653300113.00815.01234.7001006000000002568+16653300000070061030BESFS010 28006101303 UMLAGE 06
16653300119.00815.05270.7001006000000002620+16653300000070061030BESFS010 24006101303 UMLAGE 06
16653300116.06250.05280.7001006000000003800+16653300000070061030BESFS010 25006101303 Beitrag06
16653300118.03970.05270.7001006000000008723+16653300000070061030BESFS010 24006101303 ZULAGE 06
16653300113.06240.01234.7001006000000007469+16653300000070061030BESFS010 26006101303 Beitrag06

Und den "guiseppe.bat" kannst Du in eine neue Textdatei umleiten.
["guiseppe.bat >neueTextdatei.txt").

HTH Biber
Member: giuseppe0706
giuseppe0706 Oct 24, 2006 at 07:53:53 (UTC)
Goto Top
Hi Biber,

vielen herzlichen Dank für die Mühe.
Ich hab momentan leider nicht die Zeit das zu testen, aber ich denke dass ich das schon hinbekommen müsste.
Danke nochmal.

Bis denne
Member: Biber
Biber Oct 24, 2006 at 08:16:25 (UTC)
Goto Top
Eine Bitte noch:
Kannst Du bitte nach dem Testen (falls es klappt natürlich nur) den Beitrag auf "Gelöst" setzen bitte?

Danke
Biber
Member: giuseppe0706
giuseppe0706 Oct 24, 2006 at 10:26:39 (UTC)
Goto Top
Tja, Problem. Es hat nicht geklappt.

Folgende Fehler traten auf:

1. Nach einer kurzen Anpassung der Stellen (set "theCase=%thisline:~76,3%" - statt 73,3%) ratterte alles über den Bildschirm. ABER es wurden keine Werte verändert.

2. An der Stelle, an der kein Wert für "theCase" vorliegt, stoppt der Lauf mit der Meldung: "0]==[240]" ist syntaktisch an dieser Stelle nicht verarbeitbar.
Es gibt einige Datensätze, die garkeinen Wert haben. An der stelle steht leider auch nicht 000 sonst hätt ich das Problem selber lösen können. Hier sind einfach nur 3 Leerzeichen.
Member: Biber
Biber Oct 24, 2006 at 11:29:44 (UTC)
Goto Top
Moin guiseppe,

zu Problem 2)
nach der Zeile "set "theCase=%thisline:~...."
noch eine neue Zeile einfügen:
set "theCase=%theCase: =x%"  
Dann werden alle Leerzeichen durch das Zeichen "x" ersetzt und der Vergleich ist syntaktisch ok.

zu Problem 1)
Wenn kein einziger Wert anders aussieht als vorher, dann wurde wohl kein einziger der "Fälle" als %theCase% erkannt.
Dann de-kommentiere bitte die ":: echo %theCase%"-Zeile durch Entfernen der "::".

Bringen wir schon zum Fliegen.

Biber
Member: giuseppe0706
giuseppe0706 Oct 24, 2006 at 11:58:49 (UTC)
Goto Top
Also...

neuer Sachstand:

1. Seit dem Einfügen der Zeile: set "theCase=%theCase: =x%" keine Fehlermeldung mehr.
2. Eine Änderung des Inhalts konnte nicht festgestellt werden.

Vielleicht könntest du nochmal den Absatz posten, der das ganze in eine neue Datei schreibt.
Möglicherweise klappt´s ja dann.
Member: Biber
Biber Oct 24, 2006 at 12:30:00 (UTC)
Goto Top
ad 2. Eine Änderung des Inhalts konnte nicht festgestellt werden.
Hmm. Versteh ich nicht.

Dann wie folgt: dort, wo Du jetzt "DeinNameFürDenBatchOben.bat" eintippst,
tippst Du jetzt bitte ein:
DeinNameFürDenBatchOben.bat >Output.txt
....#### und wenn der fertig ist...
type output.txt

Sehr merkwürdig.

Gruß
Biber
Member: giuseppe0706
giuseppe0706 Oct 24, 2006 at 12:56:52 (UTC)
Goto Top
???????????????????????????
Wo?
Ich steh grad voll auf´m Schlauch.

Ach ja, und dann noch ne Frage muss oder soll die Batch in dem selben Ordner sein wie die Ursprungsdatei damit eine neue geschrieben werden kann?
Member: Biber
Biber Oct 24, 2006 at 13:27:36 (UTC)
Goto Top
Okay, nicht hektisch werden...

1. Irgendwo hast Du jetzt auf Deinem Rechner eine angepasste Batchdatei (deren Namen und Inhalt ich nicht genau kenne.)
2. Ist mir aber auch egal.
Füge an den Anfang eine neue 2. Zeile ein:
@echo off
<b>If [%1]== "%~0" MfG>"%~dpn0.out"</b>  
REM Am Anfang nehme ich eine komplette Zeile so wie sie ist...
....
3. Wenn Du denn Batch jetzt anstartest ohne Parameter, per Doppelklick oder vom CMD-Prompt aus, hast Du hinterher eine erzeugte Datei mit der Endung ".out" vorliegen.

Beispiel: Wenn Deine Batchdatei "Elfriede.bat" und im Verzeichnis "d:\batches" liegt, dann hast Du hinterher eine Datei "d:\batches\Elfriede.out" mit den geänderten Daten.

4. Wenn der Output anders heißen soll, kannst Du auch den neuen Pfad und Datei fest in diese neu eingegebene zweite Zeile eintragen.
STATT: "%~dpn0.out"
Fester Name: "X:\Abrechnungsdaten\berichtigt.txt" [oder was auch immer sinnvoll sein mag]
Member: giuseppe0706
giuseppe0706 Oct 24, 2006 at 14:05:24 (UTC)
Goto Top
Ich hab ne gute und ne schlechte Nachricht.
Welche zuerst?
OK, dann die gute zuerst.

Ja, es wird eine neue Datei angelegt.

Jetzt die schlechte.

Die Datensätze haben sich vom Inhalt her nicht verändert aber dafür hat jeder Datensatz in der nächsten Zeile eine 3-stellige Zahl, deren Aussagewert mir nicht bekannt ist.

16653300000.06010.03790.7001006000000010602+16653300000070061030BESFS01060326006101303 ZULAGEN 06
600
16653300000.06010.03790.7001006000000003250+16653300000070061030BESFS01060826006101303 ZULAGEN 06
600
16653300000.06010.03790.7001006000000001191+16653300000070061030BESFS01061526006101303 ZULAGEN 06
600
16653300000.06010.03790.7001006000000000708+16653300000070061030BESFS01062226006101303 ZULAGEN 06
200

Mit diesem Zusatz kann ich die neue Datei dann aber nicht mehr verbuchen.
Member: Biber
Biber Oct 24, 2006 at 14:15:30 (UTC)
Goto Top
Na, so schlimm ist das nicht.
Da hast Du Dichnur um eine Stelle verzählt, denke ich.

1. Diese "600" ist das Ergebnis von dem de-kommentierten "echo %theCase%".
Setz da wieder zwei Doppelpunkte davor und gut.

2. Wie zu sehen ist, wird aus der Zeile
16653300000.06010.03790.7001006000000001191+16653300000070061030BESFS0106152<b><u>600</u></b>6101303 ZULAGEN 06
-statt-
16653300000.06010.03790.7001006000000001191+16653300000070061030BESFS010615<b><u>260</u></b>06101303 ZULAGEN 06
..als Kriterium genommen.
Also passe bitte das jetzige "Set theCase=%thisLine:~76,3%" auf "Set theCase=%thisLine:~75,3%" an.  

Dann sollte es besser laufen.

Biber
Member: giuseppe0706
giuseppe0706 Oct 24, 2006 at 15:09:51 (UTC)
Goto Top
Wo soll ich den Kaffee und die Schokolade hinschicken?

Es geht! Der Wahnsinn! :- )

Nochmals vielen vielen Dank.

Ich werde jetzt mal versuchen ohne "fremde" Hilfe in die 2. Runde zu gehen.
Bin mir aber ziemlich sicher, dass wir uns schon bald wieder lesen werden.

Ciao Giuseppe
Member: Biber
Biber Oct 24, 2006 at 15:30:55 (UTC)
Goto Top
Na also, Guiseppe...

Kaffee und Schokolade müsstest Du nach Bremen schicken - aber das wäre so ähnlich wie Eulen nach Athen tragen...

Für einen (im Süden der Republik ganz normalen) Spatzenhobel wäre ich dankbar - die bekomm ich in Bremen ums Verrecken nicht. Aber auch das in einer späteren Runde.

Der nächste Schritt für Deine Alltags-Aufgaben-Vereinfachung könnte sein:

Verarbeitung weiter automatisieren durch
- Anlegen eines Verzeichnisses "d:\Abrechnungskrams\Original" (da stehen alle INPUT-Dateien)
- Anlegen eines Verzeichnisses "d:\Abrechnungskrams\Korrigiert" (da werden alle OUTPUT-Dateien erzeugt)
- Anpassen des Schnipsels oben, dass der jedes Mal für jede Datei im "Original"-Verzeichnis eine gleichnamige im "Korrigiert"-Verzeichnis anlegt.

Ist eine lösbare Aufgabe... und es kann ja nichts Schlimmes passieren - die Original-Dateien werden nur gelesen und jede "bereinigte Kopie" kann automatisch wieder erzeugt werden.

Ciao
Biber
Member: giuseppe0706
giuseppe0706 Oct 24, 2006 at 16:49:56 (UTC)
Goto Top
Das ist jetzt aber nicht dein Ernst, oder?
Nen Spatzenhobel?
Man könnte meinen dass du vom Süden der Republik in den Norden ausgewandert bist und ein wenig Heimweh hast.
Apropos Süden der Republik.
Hört bzw. liest man das so deutlich aus meinen Kommentaren?
Member: Biber
Biber Oct 24, 2006 at 17:47:06 (UTC)
Goto Top
Das ist jetzt aber nicht dein Ernst, oder?
Nen Spatzenhobel?
Ist mein Ernst. Außer mir kennen bestenfalls zwei weitere Bremer überhaupt diesen Ausdruck. *gg
Man könnte meinen dass du vom Süden der Republik in den Norden
ausgewandert bist und ein wenig Heimweh hast.
Weder noch - kann mir keinen schöneren Wohnort als Bremen vorstellen.
Obwohl... ein paar Sachen sind in Bremen schon schwer erhältlich... Spätzle, guter Wein, Sonne und kompetente Politiker z.B.
Apropos Süden der Republik.
Hört bzw. liest man das so deutlich aus meinen Kommentaren?
Nein, mach Dir keine Sorgen...
Natürlich hören wir Bremer das schon das schon heraus, wenn sich jemand anstrengen muss, dialektarm zu reden/zu schreiben *ggg

Ciao
Biber
Member: giuseppe0706
giuseppe0706 Oct 24, 2006 at 18:53:10 (UTC)
Goto Top
Danke! ;- (

Solltest du wirklich Interesse an einem Spätzlehobel haben, dann schreib mir doch mal ne email.
Adresse hast ja, oder?