jschikora
Goto Top

Zeichenketten aus 2 Dateien in eine Zeile einer Neuen schreiben

Hallo Zusammen,

ich habe jetzt schon eine Weile selber mit FOR-Schleifen gebastelt, komme aber irgendwie auf keinen grünen Zweig. Vielleicht könnt ihr mir ja helfen.

Ich habe folgende Ausgangssituation. Es existieren zwei .txt-Dateien die zum Beispiel so aussehen:

test1.txt
3 
Kd_Am 
Kd_Cs 
Kd_U 
time = no 
5 
2.87e+001 6.56e+004 2.86e-001 
2.33e+001 2.03e+001 1.46e-001 
2.35e+001 2.17e+005 1.22e-001 
2.78e+001 5.24e+002 1.45e-001 
1.47e+001 1.56e+005 2.32e-001

test2.txt
8 
pH 	DIC 	IS 	Al 	Ca 	Am 		Cs		U 
7.12	97.22 	128.17 	7.49 	74.01	2.21e-011	4.08e-006	1.16e-013 
7.93 	226.45	229.33	5.11 	63.22	3.33e-008	0.02		0.00
7.39 	180.75	212.33	1.56 	23.80	0.00   		1.36e-009	3.15e-005 
7.01	255.50	182.97 	0.64 	48.82	2.21e-014  	0.00		9.88e-010 
7.614 	161.72	348.16	0.38 	106.91	4.27e-007   	3.189e-013	1.77e-006 

Als Ergebnis hätte ich gerne, dass die Zahlenfolge ab Zeile 3 der test2.txt und die Zahlen ab Zeile 7 von test1.txt ausgelesen werden und jeweils in einer Zeile einer neuen Datei (z.B. gesamt.txt) zusammengefügt werden.
Die sollte dann so aussehen:

gesamt.txt
7.12	97.22 	128.17 	7.49 	74.01	2.21e-011	4.08e-006	1.16e-013  2.87e+001 6.56e+004 2.86e-001
7.93 	226.45	229.33	5.11 	63.22	3.33e-008	0.02		0.00  2.33e+001 2.03e+001 1.46e-001 
...

Schonmal vielen Dank im vorraus.

Johannes

Content-Key: 161955

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

Printed on: April 25, 2024 at 10:04 o'clock

Member: miniversum
miniversum Mar 03, 2011 at 11:44:53 (UTC)
Goto Top
Vorausgesetzt du hast in beiden Dateien immer die Gleiche anzahl an Zahlenreihen dann würde es vom Prinzip her so gehen:
1. Auslesen wie viele Zeilen es sind -> findstr /n und zahl rausholen mit einer For schleife
2. Zeilenanzahl-2=Datensatzanzahl (Bei test2.txt)
3. Mit diesem konstrukt kannst du immer die gewünschte relevante zeile auslesen:
set "x="
FOR /F "skip=2 delims=" %i in (test2.txt) do in not defined x set x=%%i
In x steht danach die 3. Zeile (durch das skip=2)
4. Jetzt wird das ganze verschachtelt. du zählst von 1 bis anzahl der datensätze durch, nimmst diese zählvariable - 1 als wert für skip und liest mit dem obigen Beispiel die test1.txt und test2.txt aus. Die Ergebnisse hänngst du zusammen und schreibst sie in gesamt.txt
Zu beachten ist:
a. der wert für skip muss halt den offset von 2 bzw. 6 aufaddiert bekommen und
b. skip=0 geht nicht (was ja nicht vorkommen sollte
Member: jschikora
jschikora Mar 03, 2011 at 14:06:53 (UTC)
Goto Top
Also ich habe jetzt mit Hilfe deiner Tipps folgende Code-Zeilen zusammengeschrieben. Irgendwo muss ich aber noch einen Fehler haben, da ich das Ganze noch nicht zum laufen bekomme.

@echo off & setlocal
set counter=0
set /p "daten=Anzahl der Datensaetze eingeben:"  

FOR %%i in (1,1,%daten%) do (
	
	set /a a=%%i+1
	set /a b=%%i+5

	set "x="  
	FOR /F "skip=%a% " %%j in (test2.txt) do in not defined x set x=%%j  
	
	set "y="  
	FOR /F "skip=%b% " %%k in (test1.txt) do in not defined y set y=%%k  
	
	echo %x% %y% >> gesamt.txt
	
	set /a counter=counter+1
	if %counter% equ %daten% goto ende
)

:ende
pause
Member: pieh-ejdsch
pieh-ejdsch Mar 03, 2011 at 14:08:51 (UTC)
Goto Top
moin jschikora,

sofern keine Doppelpunkte am Zeilenanfang stehen könnte es so gehen.
set "Datei1=D:\test1.txt"  
set "Datei2=D:\test2.txt"  
set "Sprung1=6"  
set "Sprung2=2"  
set "Ausgabe=D:\Ausgabe.txt"  

type nul>"%Ausgabe%"  
for /f "tokens=1* delims=:" %%i in ('more +%Sprung1% "%Datei1%"^|findstr /n "^"') do (  
	for /f "tokens=1* delims=:" %%k in ('more +%Sprung2% "%Datei2%"^|findstr /n "^"^|findstr /b "%%i:"') do >>"%Ausgabe%" echo %%j  %%l  
)

Gruß Phil
Member: jschikora
jschikora Mar 03, 2011 at 14:29:40 (UTC)
Goto Top
Moin Phil,

ich habe jetzt die beiden Dateien in einem Ordner Test auf meinem Desktop und wenn ich deinen Code als Batch-Datei ausführe erhalte ich folgenden Fehler: " Auf C:\Dokumente und Einstellungen\js5874\Desktop\Test\+ kann nicht zugegriffen werden"
Member: pieh-ejdsch
pieh-ejdsch Mar 03, 2011 at 14:39:32 (UTC)
Goto Top
ups ein kleiner Schreibfehler von mir.
schau mal in die zweite Forschleife - da steht %Spung2% aber es sollte %Sprung2% heissen.

Gruß Phil
Member: jschikora
jschikora Mar 03, 2011 at 14:47:57 (UTC)
Goto Top
super... jetzt funktionierts face-smile

vielen dank
johannes
Member: miniversum
miniversum Mar 03, 2011 at 17:28:16 (UTC)
Goto Top
Jetzt mal vom drüber schauen her fällt mir folgendes auf:
- Den counter brauchst du eigentlich nicht, da die schleife sowieso aufhört wenn alle durch sind.
- Bei den beiden for schleifen zum auslesen der Dateien würde ich "skip=%a% delims=" benutzen damit die Leerzeichen nicht als trennzeichen benutzt werden
- Wenn du die eignetliche Funktion in eine Unterprozedur packst und in mit der for schleife in Zeile 5 per call aufrufst klappt das mit dem set /a, bzw. die auflösung der variabeln.