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!
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!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 42773
Url: https://administrator.de/forum/inhalt-von-textdatei-per-routine-aendern-42773.html
Ausgedruckt am: 25.04.2025 um 18:04 Uhr
22 Kommentare
Neuester Kommentar
Moin guiseppe0706,
dann lass doch einen Einzeiler vom CMD-Prompt drüberschrubbeln,
[ 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
dann lass doch einen Einzeiler vom CMD-Prompt drüberschrubbeln,
1
>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
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
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
Moin Guiseppe,
dann wäre das eine erste Skizze:
Demo des Schnipsels am CMD-Prompt:
Und den "guiseppe.bat" kannst Du in eine neue Textdatei umleiten.
["guiseppe.bat >neueTextdatei.txt").
HTH Biber
dann wäre das eine erste Skizze:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
:: ---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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(= 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
Moin guiseppe,
zu Problem 2)
nach der Zeile "set "theCase=%thisline:~...."
noch eine neue Zeile einfügen:
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
zu Problem 2)
nach der Zeile "set "theCase=%thisline:~...."
noch eine neue Zeile einfügen:
1
set "theCase=%theCase: =x%"
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
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:
1
2
3
2
3
DeinNameFürDenBatchOben.bat >Output.txt
....#### und wenn der fertig ist...
type output.txt
Sehr merkwürdig.
Gruß
Biber
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:
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]
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:
1
2
3
4
2
3
4
@echo off
<b>If [%1]== "%~0" MfG>"%~dpn0.out"</b>
REM Am Anfang nehme ich eine komplette Zeile so wie sie ist...
....
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]
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
Dann sollte es besser laufen.
Biber
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
1
2
3
4
5
2
3
4
5
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
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
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
Das ist jetzt aber nicht dein Ernst, oder?
Nen Spatzenhobel?
Ist mein Ernst. Außer mir kennen bestenfalls zwei weitere Bremer überhaupt diesen Ausdruck. *ggNen Spatzenhobel?
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.ausgewandert bist und ein wenig Heimweh hast.
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...Hört bzw. liest man das so deutlich aus meinen Kommentaren?
Natürlich hören wir Bremer das schon das schon heraus, wenn sich jemand anstrengen muss, dialektarm zu reden/zu schreiben *ggg
Ciao
Biber