Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Inhalt von Textdatei per Routine ändern

Frage Entwicklung Batch & Shell

Mitglied: giuseppe0706

giuseppe0706 (Level 1) - Jetzt verbinden

23.10.2006, aktualisiert 24.10.2006, 5112 Aufrufe, 22 Kommentare

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!
Mitglied: Biber
23.10.2006 um 09:25 Uhr
Moin guiseppe0706,

dann lass doch einen Einzeiler vom CMD-Prompt drüberschrubbeln,
01.
>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
Bitte warten ..
Mitglied: giuseppe0706
23.10.2006 um 11:52 Uhr
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.
Bitte warten ..
Mitglied: Biber
23.10.2006 um 12:04 Uhr
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
Bitte warten ..
Mitglied: giuseppe0706
23.10.2006 um 19:29 Uhr
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
Bitte warten ..
Mitglied: Biber
23.10.2006 um 19:52 Uhr
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
Bitte warten ..
Mitglied: giuseppe0706
23.10.2006 um 22:52 Uhr
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.
Bitte warten ..
Mitglied: Biber
24.10.2006 um 09:28 Uhr
Moin Guiseppe,

dann wäre das eine erste Skizze:

01.
:: ---snipp guiseppe.bat--------- 
02.
@echo off 
03.
REM Am Anfang nehme ich eine komplette Zeile so wie sie ist... 
04.
For /f "delims=" %%i in (\Administrator\guiseppe.txt) do call :processThisLine %%i 
05.
goto :eof      
06.
 
07.
 
08.
:processThisLine [Parameter ist eine Zeile aus der Inputdatei 
09.
 set "thisline=%*" 
10.
 set "theCase=%thisline:~73,3%" & set "first8Chars=%thisline:~0,8%" 
11.
 ::echo %theCase% 
12.
 if [%theCase%]==[240] For /f "tokens=1-3,* delims=." %%a in ("%ThisLine%") do @(echo %%a.%%b.05270.%%d) & goto :eof 
13.
 if [%theCase%]==[250] For /f "tokens=1-3,* delims=." %%a in ("%ThisLine%") do @(echo %%a.%%b.05280.%%d) & goto :eof 
14.
 if [%theCase%]==[260] For /f "tokens=1-3,* delims=." %%a in ("%ThisLine%") do @(echo %%a.06240.%%c.%%d) & goto :eof 
15.
 if [%theCase%]==[280] For /f "tokens=1-3,* delims=." %%a in ("%ThisLine%") do @(echo %first8Chars%113.%%b.%%c.%%d) & goto :eof 
16.
 echo %thisline% 
17.
 goto :eof 
18.
::--------snapp guiseppe.bat 
Demo des Schnipsels am CMD-Prompt:
01.
(= 9:22:33  F:\=) 
02.
>type Administrator\guiseppe.txt 
03.
16653300115.00815.01234.7001006000000002568+16653300000070061030BESFS010 28006101303 UMLAGE 06 
04.
16653300119.00815.01234.7001006000000002620+16653300000070061030BESFS010 24006101303 UMLAGE 06 
05.
16653300116.06250.01234.7001006000000003800+16653300000070061030BESFS010 25006101303 Beitrag06 
06.
16653300118.03970.01234.7001006000000008723+16653300000070061030BESFS010 24006101303 ZULAGE 06 
07.
16653300113.03980.01234.7001006000000007469+16653300000070061030BESFS010 26006101303 Beitrag06 
08.
 
09.
(= 9:24:53  F:\=) 
10.
>Administrator\guiseppe.bat 
11.
16653300113.00815.01234.7001006000000002568+16653300000070061030BESFS010 28006101303 UMLAGE 06 
12.
16653300119.00815.05270.7001006000000002620+16653300000070061030BESFS010 24006101303 UMLAGE 06 
13.
16653300116.06250.05280.7001006000000003800+16653300000070061030BESFS010 25006101303 Beitrag06 
14.
16653300118.03970.05270.7001006000000008723+16653300000070061030BESFS010 24006101303 ZULAGE 06 
15.
16653300113.06240.01234.7001006000000007469+16653300000070061030BESFS010 26006101303 Beitrag06
Und den "guiseppe.bat" kannst Du in eine neue Textdatei umleiten.
["guiseppe.bat >neueTextdatei.txt").

HTH Biber
Bitte warten ..
Mitglied: giuseppe0706
24.10.2006 um 09:53 Uhr
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
Bitte warten ..
Mitglied: Biber
24.10.2006 um 10:16 Uhr
Eine Bitte noch:
Kannst Du bitte nach dem Testen (falls es klappt natürlich nur) den Beitrag auf "Gelöst" setzen bitte?

Danke
Biber
Bitte warten ..
Mitglied: giuseppe0706
24.10.2006 um 12:26 Uhr
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.
Bitte warten ..
Mitglied: Biber
24.10.2006 um 13:29 Uhr
Moin guiseppe,

zu Problem 2)
nach der Zeile "set "theCase=%thisline:~...."
noch eine neue Zeile einfügen:
01.
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
Bitte warten ..
Mitglied: giuseppe0706
24.10.2006 um 13:58 Uhr
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.
Bitte warten ..
Mitglied: Biber
24.10.2006 um 14:30 Uhr
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:
01.
DeinNameFürDenBatchOben.bat >Output.txt 
02.
....#### und wenn der fertig ist... 
03.
type output.txt
Sehr merkwürdig.

Gruß
Biber
Bitte warten ..
Mitglied: giuseppe0706
24.10.2006 um 14:56 Uhr
???????????????????????????
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?
Bitte warten ..
Mitglied: Biber
24.10.2006 um 15:27 Uhr
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:
01.
@echo off 
02.
<b>If [%1]==[] "%~0" Mit freundlichen Grüßen>"%~dpn0.out"</b> 
03.
REM Am Anfang nehme ich eine komplette Zeile so wie sie ist... 
04.
....
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]
Bitte warten ..
Mitglied: giuseppe0706
24.10.2006 um 16:05 Uhr
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.
Bitte warten ..
Mitglied: Biber
24.10.2006 um 16:15 Uhr
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
01.
16653300000.06010.03790.7001006000000001191+16653300000070061030BESFS0106152<b><u>600</u></b>6101303 ZULAGEN 06 
02.
-statt- 
03.
16653300000.06010.03790.7001006000000001191+16653300000070061030BESFS010615<b><u>260</u></b>06101303 ZULAGEN 06 
04.
..als Kriterium genommen. 
05.
Also passe bitte das jetzige "Set theCase=%thisLine:~76,3%" auf "Set theCase=%thisLine:~75,3%" an.
Dann sollte es besser laufen.

Biber
Bitte warten ..
Mitglied: giuseppe0706
24.10.2006 um 17:09 Uhr
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
Bitte warten ..
Mitglied: Biber
24.10.2006 um 17:30 Uhr
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
Bitte warten ..
Mitglied: giuseppe0706
24.10.2006 um 18:49 Uhr
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?
Bitte warten ..
Mitglied: Biber
24.10.2006 um 19:47 Uhr
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
Bitte warten ..
Mitglied: giuseppe0706
24.10.2006 um 20:53 Uhr
Danke! ;- (

Solltest du wirklich Interesse an einem Spätzlehobel haben, dann schreib mir doch mal ne email.
Adresse hast ja, oder?
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Erkennung und -Abwehr
Lokale Virenprüfstation : Windows 10: Ändern von Einstellungen verhinden (5)

Frage von TryAndSolve zum Thema Erkennung und -Abwehr ...

Batch & Shell
gelöst Powershell - In Textdatei suchen und ersetzen (5)

Frage von Raaja89 zum Thema Batch & Shell ...

Exchange Server
Inhalt von Postfächern in Exchange löschen (9)

Frage von m.reeger zum Thema Exchange Server ...

Windows Server
gelöst Word 2010 : Absatz - Abstand per GPO ändern (3)

Frage von johanna-p zum Thema Windows Server ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (32)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...