mario.steinberg
Goto Top

Mittels Batch verschiedene Textabschnitte extrahieren und daraus eine neue Datei aufbauen

Guten Tag!

Hallo,

ich habe folgende Problemstellung.

Ich möchte mittels Batch aus verschiedenen SQL CREATE TABLE Aufrufen endsprechende StoredProcedures generieren.

Aus dem Ihnalt meiner Beispieldatei "Meine_Tabellen.SQL",

CREATE TABLE Meine_SpeedList (
	id int IDENTITY(1,1) NOT NULL,
	identifier varchar(80) NULL,
	speed int DEFAULT 0 NULL,
	listId int NULL
)
;

CREATE TABLE Meine_SpeedList 2 (
	id int IDENTITY(1,1) NOT NULL,
	identifier varchar(80) NULL,
	speed int DEFAULT 0 NULL,
	listId int NULL
)
;

sollen zwei Dateien entstehen deren Name sich aus dem Namen der jeweiligen Tabelle zusammensetzt. Z.B. "update_Meine_SpeedList.sql"
Ihr Ihnalt soll folgendermaßen aussehen:

CREATE PROCEDURE update_Meine_SpeedList (
	@identifier varchar(80),
	@speed int,
	@listId int,
	@index int,
	@return_code int=0 OUTPUT ) AS
update Meine_SpeedList
SET
	identifier = @identifier,
	speed = @speed,
	listId = @listId,
where id = @index
select @return_code = @@ERROR
go

// gleiches für update_Meine_SpeedList2

Einen Teil meinses Problems konnte ich bereits mittels

@echo off 
setlocal enabledelayedexpansion

set ORDNERNAME=NeuerOrdner

for /f "delims=" %%i in ('dir /a:-d /b *.SQL') do (	  
	for /f "tokens=3" %%j in ('findstr /C:"CREATE TABLE" %%i') do (  
		if exist %ORDNERNAME%\update_%%j.sql del %ORDNERNAME%\update_%%j.sql
		echo CREATE PROCEDURE update_%%j ( >> %ORDNERNAME%\update_%%j.sql
		echo update %%j >> %ORDNERNAME%\update_%%j.sql
		echo SET >> %ORDNERNAME%\update_%%j.sql
		)
)

lösen. Wie ihr seht, fehlt mir noch einiges wie z.B. das extrahieren der einzeilen Parameter identifier, speed etc.

Kann mir vielleicht jemand auf die Sprünge helfen?

Danke und einen schönen, wenn auch kalten, Tag!

Content-ID: 156012

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

Ausgedruckt am: 19.11.2024 um 20:11 Uhr

Mario.Steinberg
Mario.Steinberg 30.11.2010 um 13:02:08 Uhr
Goto Top
Hallo,

ich habe ein Beispiel im Forum gefunden und nun auch die erste und letzte Zeile des CREATE TABLE Aufrufes.

@echo off 
setlocal enabledelayedexpansion

set ORDNERNAME=NeuerOrdner

for /f "delims=" %%i in ('dir /a:-d /b *.SQL') do (	  
	set /a counter=1
	for /f "delims=:" %%j in ('findstr /n /c:"CREATE TABLE" %%i') do (  
		set %%i_ZeileAb[!counter!]=%%j 
		set /a counter=!counter! + 1
	)
	
	set /a counter=1
	for /f "delims=:" %%k in ('findstr /n /c:";" %%i') do (  
		if %%k gtr !%%i_ZeileAb[!!counter!!]! (
			set %%i_ZeileBis[!counter!]=%%k
		) else (
			echo Fehler in %%i Zeile %%k
			goto END
		)
		set /a counter=!counter! + 1
	)

	REM PLATZHALTER 23
)
set create
:END
pause

hier mal die Ausgaben:

create.SQL_ZeileAb[1]=1
create.SQL_ZeileAb[2]=11
create.SQL_ZeileBis[1]=9
create.SQL_ZeileBis[2]=19
create2.SQL_ZeileAb[1]=1
create2.SQL_ZeileAb[2]=11
create2.SQL_ZeileBis[1]=9
create2.SQL_ZeileBis[2]=19

Nun bin ich auf ein weiters Problem gestoßen.
Im Code bei PLATZHALTER 23 habe ich, angelehnt an die For-Schleife darüber, folgenden Code eingefügt:


set /a counter=1
for /f "tokens=3" %%l in ('findstr /C:"CREATE TABLE" %%i') do (
set %%i_Filename[!counter!]=%ORDNERNAME%\update_%%l.sql
echo !%%i_Filename[!!counter!!]!
set /a counter=!counter! + 1
)


Wenn ich mir mittels set die Umgebungswariablen anschaue kann ich u.a. folgendes finden:

create.SQL_Filename[1]=NeuerOrdner\update_AWUSME_SpeedRPMRtList.sql

Allerdings erhalte ich mittels echo !%%i_Filename[!!counter!!]! nicht wie erwartet NeuerOrdner\update_AWUSME_SpeedRPMRtList.sql sondern lediglich eine Zahl, hier z.B. 1
WO LIEGT MEIN PROBLEM ?

Wenn alles so klappt wie geplant sollte es doch jetzt möglich sein die Inhalte zwischen den jeweiligen Zeilennummern zu extrahieren und in die gewünschte Form zu gießen, oder?

Danke und Gruß!
Mario.Steinberg
Mario.Steinberg 01.12.2010 um 13:22:08 Uhr
Goto Top
So geschafft!

@echo off 
setlocal enabledelayedexpansion

set ORDNERNAME=Result
if not exist %ORDNERNAME% mkdir %ORDNERNAME%

for /f "delims=. tokens=1,2" %%h in ('dir /a:-d /b *.SQL') do (	  
	set /a counter=1
	for /f "tokens=1,4 delims=: " %%j in ('findstr /n /c:"CREATE TABLE" %%h.%%i') do (  
		set /a %%h_ZeileAb_!counter!=%%j 
		set %%h_Procedurename_!counter!=%%k
		set /a counter=!counter! + 1
	)
	
	set /a counter=!counter! - 1
	for /l %%k in (1 1 !counter!) do (
		set GEFUNDEN=FALSE
		for /f "delims=:" %%l in ('findstr /n /c:";" %%h.%%i') do (  
			if %%l gtr !%%h_ZeileAb_%%k! if !GEFUNDEN!==FALSE (
				set /a %%h_ZeileBis_%%k=%%l
				set GEFUNDEN=TRUE
			)
		)
	)
	
	for /l %%m in (1 1 !counter!) do (	
		REM ######### UPDATE PROCEDURE #########
		set FILENAME=%ORDNERNAME%\update_!%%h_Procedurename_%%m!.sql
		if exist !FILENAME! del !FILENAME!
		
		echo CREATE PROCEDURE update_!%%h_Procedurename_%%m! ( >> !FILENAME!
		for /f "tokens=1,2,3 delims=:	 " %%n in ('findstr /n "^" %%h.%%i') do (  
			set /a ZeileAb=!%%h_ZeileAb_%%m!+1
			set /a ZeileBis=!%%h_ZeileBis_%%m!-2
			if %%n gtr !ZeileAb! if %%n leq !ZeileBis! (
				echo 						@%%o %%p, >> !FILENAME!
			)
		)
		echo 						@index int, >> !FILENAME!
		echo 						@return_code int=0 OUTPUT ^) AS >> !FILENAME!
		echo update !%%h_Procedurename_%%m! >> !FILENAME!
		echo SET >> !FILENAME!

		for /f "tokens=1,2,3 delims=:	 " %%n in ('findstr /n "^" %%h.%%i') do (  
			set /a ZeileAb=!%%h_ZeileAb_%%m!+1
			set /a ZeileBis=!%%h_ZeileBis_%%m!-2
			if %%n gtr !ZeileAb! if %%n leq !ZeileBis! (
				if not %%n equ !ZeileBis! (
					echo 	%%o = @%%o, >> !FILENAME!
				) else (
					echo 	%%o = @%%o >> !FILENAME!
				)
			)
		)	
		echo where id = @index >> !FILENAME!
		echo select @return_code = @@ERROR>> !FILENAME!
		echo go >> !FILENAME!
	)
)

Gibt es noch Verbesserungsbedarf?