underdog81
Goto Top

In eine TXT eine Zeile Einfügen und eine Counter in den folgenden Zeilen

Ich hab hier gute Erfahrungen gemacht und
wende mich nun wieder an euch.

Hallo,

Ich habe hier einen Handscanner (mobile) bei dem ich es nicht mit der Hersteller Software hinbekomme
das gewünschte Ergebnis zu erziehlen.

Hier ein Beispiel wie die Datei sein sollte:

K;Warenentnahme;10007;
D;1;4040056000759;20;Ja
D;2;4040056001169;10;Ja

Hier wie ich sie vom Scanner bekomme:

D;4040056000759;20;Ja
D;4040056001169;10;Ja


Wie man sieht fehlt die erste Zeile in der Datei
und in den folgezeilen die fortlaufende Nummer der Datensätze.
Ich könnte hier nur eine Zahl angeben, die immer gleich ist.
etwa so: (mit einer Null)
D;0;4040056000759;20;Ja
D;0;4040056001169;10;Ja

Ich hab jetzt an eine Batch gedacht, die mir die fehlen Daten einträgt.
Ist es überhaupt möglich mit einer Batch?

Bin für jede Hilfe Dankbar face-smile

Content-ID: 184211

Url: https://administrator.de/forum/in-eine-txt-eine-zeile-einfuegen-und-eine-counter-in-den-folgenden-zeilen-184211.html

Ausgedruckt am: 24.12.2024 um 14:12 Uhr

76109
76109 27.04.2012 um 15:27:19 Uhr
Goto Top
Hallo Underdog81!

Unter der Annahme, das die Textzeile immer mit "D;" beginnt, könnte es mit diesem (*.vbs)-Skript funktionieren:
Const FileIn = "E:\Test\Ein.txt"  
Const FileOut = "E:\Test\Aus.txt"  

Dim Fso, File, Text, Textzeile, Counter
    
Set Fso = CreateObject("Scripting.FileSystemObject")  
    
Set File = Fso.OpenTextFile(FileIn)
    
Text = Split(File.ReadAll, vbCrLf):   File.Close
    
Set File = Fso.CreateTextFile(FileOut)
    
'Text in "" Entsprechend anpassen, damit die Anzahl der Speperatoren stimmen  
File.WriteLine "K;Warenentnahme;10007;"  
    
Counter = 1
    
For Each Textzeile In Text
    If Textzeile <> "" Then  
        File.WriteLine Replace(Textzeile, "D;", "D;" & Counter & ";")  
        Counter = Counter + 1
    End If
Next
    
File.Close

Gruß Dieter
Underdog81
Underdog81 27.04.2012 um 16:29:53 Uhr
Goto Top
DANKE didi1954 !! :D

Ja die Textzeilen fangen immer mit dem D; an.
Und es geht perfekt muss ich dazu sagen.

Ich bedanke micht sehr und wünsche ein entspanntes und langes Wochenende.
76109
76109 27.04.2012 um 17:10:26 Uhr
Goto Top
Hallo Underdog81!

Jepp, gern geschehenface-wink

Wünsche Dir auch ein schönes sonniges Wochenende

Gruß Dieter
bastla
bastla 27.04.2012 um 17:19:59 Uhr
Goto Top
Hallo Underdog81!

Nur der Vollständigkeit halber (und um die Frage
Ist es überhaupt möglich mit einer Batch?
zu beantworten face-wink):
@echo off & setlocal
set "Ein=D:\Ein.txt"  
set "Aus=D:\Aus.txt"  
set "Delim=;"  

>"%Aus%" echo K;Warenentnahme;10007;  
for /f "tokens=1,2* delims=:%Delim%" %%a in ('findstr /n "^" "%Ein%"') do >>"%Aus%" echo %%b%Delim%%%a%Delim%%%c  
Wie bei Dieters Ansatz gilt auch hier: Zeile 6 ggf anpassen ...
Und für alle, die's gerne kürzer mögen:
@>"D:\Aus.txt" (@echo K;Warenentnahme;10007;&@for /f "tokens=1,2* delims=:;" %%a in ('findstr /n "^" "D:\Ein.txt"') do @echo %%b;%%a;%%c)
Grüße
bastla
Underdog81
Underdog81 27.04.2012 um 17:29:17 Uhr
Goto Top
Danke bastla face-smile

ich arbeite nämlich mmit einer batch die Programme nacheinander ab, daß die Leute nur noch einen Doppelklick
machen müssen.
bastla
bastla 27.04.2012 um 17:30:59 Uhr
Goto Top
Hallo Underdog81!
ich arbeite nämlich mmit einer batch die Programme nacheinander ab
Das spräche noch nicht gegen die Verwendung des VBScripts - auf Wunsch ließe sich das auch vom Batch selbst erzeugen;etwas kompakter zB:
@echo off & setlocal
set "Ein=D:\Ein.txt"  
set "Aus=D:\Aus.txt"  

set C=%temp%\ConvertSannerCSV.vbs
 >%C% echo Set fso=CreateObject("Scripting.FileSystemObject"):Text=Split(fso.OpenTextFile("%Ein%").ReadAll,vbCrLf)  
>>%C% echo Set File=fso.CreateTextFile("%Aus%"):File.WriteLine "K;Warenentnahme;10007;"  
>>%C% echo For i=0 To UBound(Text):Z=Text(i):If Z^<^>"" Then:File.WriteLine "D;"^&i+1^&Mid(Z,2):End If:Next  
cscript //nologo %C%
Annahme hier wie oben: Es gibt zwischen den einzelnen Zeilen der Datei keine Leerzeilen ...

Grüße
bastla
76109
76109 27.04.2012 um 20:52:09 Uhr
Goto Top
Hallo bastla!

War mir schon klar, dass es mit Batch wesentlich kürzer geht. Zumindest, wenn Du sie schreibstface-smile

Annahme hier wie oben: Es gibt zwischen den einzelnen Zeilen der Datei keine Leerzeilen ...
Wenn die letzte Zeile einen Zeilenumbruch enthält, dann hat die letzte UBound-Zeile ein "" drinnenface-wink

Gruß Dieter
bastla
bastla 27.04.2012 um 20:58:51 Uhr
Goto Top
Hallo Dieter!
Wenn die letzte Zeile einen Zeilenumbruch enthält, dann hat die letzte UBound-Zeile ein "" drinnenface-wink
Deswegen auch "zwischen den Zeilen" ... face-wink
War mir schon klar, dass es mit Batch wesentlich kürzer geht. Zumindest, wenn Du sie schreibstface-smile
Der Einzeiler ist ja nur Spaß face-wink - aber ein Batch wird so gut wie immer kürzer sein als ein VBScript (Ausnahme wären etwa Zeitberechnungen) - aber oft dafür länger laufen ...

Grüße
bastla
Underdog81
Underdog81 30.04.2012 um 15:24:09 Uhr
Goto Top
Also ich hab ne Kombi aus beiden face-big-smile

Da es ein zusammenhängender Ablauf ist muss ich eh ein "wait" einbauen.
Deshlab ist hier die Zeit der Prozesse egal.

Aber es geht alles top muss ich sagen.
Ich steuer die Programme und das VBS über eine Batch mit einem wait befehl dazwischen.

So muss der User nur och warten bis alles wieder von alleine geschlossen wird.