Page 1 of 1
Replacement of Operator
Posted: 18 Jul 2018 04:18
by pp8771
The file a1.dat contains
Code: Select all
COMPID~COMPNAME~ADDRESS~YEAROFESTABLISTMENT
I have written a code to replace the operator ~ by "," and append " in the beginning and end of the line.
So written a small code.
Code: Select all
@echo off
setlocal enabledelayedexpansion
set vffname=D:\a1.dat
REM echo !vffname!
set "vtilda=~"
REM remember vtilda can be % ,
set vheader=
set /p "vheader="<"!vffname!"
echo 1 !vheader!
set vheader="!vheader!"
echo 2 !vheader!
REM set vheader="!vheader:|=","!"
set vheader="!vheader:!!vtilda!!=","!"
echo 3 !vheader!
Required Output
Code: Select all
"COMPID","COMPNAME","ADDRESS","YEAROFESTABLISTMENT"
Getting an strange error:
Code: Select all
1 COMPID~COMPNAME~ADDRESS~YEAROFESTABLISTMENT
2 "COMPID~COMPNAME~ADDRESS~YEAROFESTABLISTMENT"
3 "~"
Re: Replacement of Operator
Posted: 18 Jul 2018 11:56
by pieh-ejdsch
Hello,
You only make this special replacement by
Code: Select all
:replace
for /f "tokens=1*delims=~" %%i in ("!vheader!") do (
if .%%j neq . (
set "vheader=%%i","%%j"
goto :replace
)
)
echo !vheader!
Phil
Re: Replacement of Operator
Posted: 18 Jul 2018 13:18
by pp8771
Delimiter will be a parameter and not an hard code value
I want to put that in a variable set "vtilda=~"
Re: Replacement of Operator
Posted: 18 Jul 2018 13:37
by Squashman
pp8771 wrote: ↑18 Jul 2018 13:18
Delimiter will be a parameter and not an hard code value
I want to put that in a variable set "vtilda=~"
Then why did you name the variable tilda if it is really delimiter?
And what happened when you changed the code so that the delims= option had your variable name after it?
Re: Replacement of Operator
Posted: 18 Jul 2018 14:37
by pp8771
Now modified it for a single line
Code: Select all
@echo off
setlocal enabledelayedexpansion
set vffname=D:\a1.dat
REM echo !vffname!
set "vtilda=^="
REM echo !vtilda!
REM echo: FILE SIZE !vsize!
set vheader=
REM set vcolumnlist=
set /p "vheader="<"!vffname!"
setlocal
:replace
for /f "tokens=1*delims=%vtilda%" %%i in ("!vheader!") do (
if .%%j neq . (
set "vheader=%%i","%%j"
goto :replace
)
)
set vheader="!vheader!"
echo !vheader!
endlocal
REM echo 1 !vheader!
REM set vheader="!vheader!"
REM echo 2 !vheader!
REM set vheader="!vheader:|=","!"
REM set vheader=!vheader:~=","!
REM echo 3 !vheader!
pause
But not able to read multiple lines
Re: Replacement of Operator
Posted: 18 Jul 2018 14:45
by Squashman
pp8771 wrote: ↑18 Jul 2018 14:37
But not able to read multiple lines
You never specified that you needed to do that in your original requirements. If you need to read the entire file then use another FOR /F command to read the file. Then use a CALL to the function that changes the delimiter. But personally I would just use
Dave's ParseCSV.bat
Re: Replacement of Operator
Posted: 19 Jul 2018 01:30
by pp8771
My input file [a1.dat] is
Code: Select all
COMPID=COMPNAME=ADDRESS=YEAROFESTABLISTMENT
100=XYC=AWER RD=12072018
120=BNM=PQTY RD=12082018
100=XYC=AWER RD=12072018
120=BNM=PQTY RD=12082018
Required output
Code: Select all
'100','XYC','AWER RD','12072018'
'120','BNM','PQTY RD','12082018'
'100','XYC','AWER RD','12072018'
'120','BNM','PQTY RD','12082018'
But this code is not working. Assistance is appreciated.it is going in infinite loop.now some it is working.
Code: Select all
@echo off
REM setlocal enabledelayedexpansion
GOTO :MAIN
setlocal
:replace
echo 2.1 %~1 %~2
set vdl=%~2
set vln=%~1
:replace2
for /F "tokens=1*delims=%vdl%" %%q in ("%vln%") do (
echo 2.2 %%q %%r
pause
if .%%r neq . (
set "vln=%%q','%%r"
echo 2.3 !vln!
goto :replace2
)
)
echo 2.4 !vln!
set vln='!vln!'
echo 2.5 !vln!
set "%~3=%vln%"
goto :EOF
:MAIN
set vffname=D:\a1.dat
REM echo !vffname!
set "vtilda=^="
REM echo !vtilda!
REM echo: FILE SIZE !vsize!
REM echo 1 !vheader!
REM set vheader="!vheader!"
REM echo 2 !vheader!
REM set vheader="!vheader:|=","!"
REM set vheader=!vheader:~=","!
REM echo 3 !vheader!
FOR /F "skip=1 usebackq delims=" %%G IN ("!vffname!") DO (
set "line=%%~G"
REM set "line='!line:|=','!'"
REM echo !line!
setlocal
call :replace "!line!" "%vtilda%" fline
echo 1.2 !fline!
set iline=!fline!
endlocal
)
pause
But when I am reading the header of the file now things are working fine.
Code: Select all
@echo off
setlocal enabledelayedexpansion
set vffname=D:\a1.dat
REM echo !vffname!
set "vtilda=^="
REM echo !vtilda!
REM echo: FILE SIZE !vsize!
set vheader=
REM set vcolumnlist=
set /p "vheader="<"!vffname!"
setlocal
:replace
for /f "tokens=1*delims=%vtilda%" %%i in ("!vheader!") do (
if .%%j neq . (
set "vheader=%%i","%%j"
echo !vheader!
goto :replace
)
)
set vheader="!vheader!"
echo !vheader!
endlocal
REM echo 1 !vheader!
REM set vheader="!vheader!"
REM echo 2 !vheader!
REM set vheader="!vheader:|=","!"
REM set vheader=!vheader:~=","!
REM echo 3 !vheader!
pause
Re: Replacement of Operator
Posted: 20 Jul 2018 05:03
by pp8771
Really I am looking for assistance from senior members how to read the delimited files.
The code is working for delimiter ~,|,=, # but not for % . can any one has idea what is wrong with this code.
Assistance is really appreciated.
My file a1.dat is:
Code: Select all
COMPID%COMPNAME%ADDRESS%YEAROFESTABLISTMENT
100%XYC%AWER RD%12072018
120%BNM%PQTY RD%12082018
100%XYC%AWER RD%12072018
120%BNM%PQTY RD%12082018
Code: Select all
@echo off
REM setlocal enabledelayedexpansion
GOTO :MAIN
setlocal
:replace
echo 2.1 %~1 %~2
set vdl=%~2
set vln=%~1
echo 2.1.1 %vln% delimite %vdl%
:replace2
for /F "tokens=1*delims=%vdl%" %%q in ("%vln%") do (
echo 2.2 %%q %%r
if .%%r neq . (
set "vln=%%q','%%r"
echo 2.3 !vln!
goto :replace2
)
)
echo 2.4 !vln!
set vln='!vln!'
echo 2.5 !vln!
set "%~3=%vln%"
goto :EOF
:MAIN
set vffname=D:\a1.dat
REM echo !vffname!
set "vtilda=%%"
REM echo !vtilda!
REM echo: FILE SIZE !vsize!
REM echo 1 !vheader!
REM set vheader="!vheader!"
REM echo 2 !vheader!
REM set vheader="!vheader:|=","!"
REM set vheader=!vheader:~=","!
REM echo 3 !vheader!
FOR /F "skip=1 usebackq delims=" %%G IN ("!vffname!") DO (
set "line=%%~G"
REM set "line='!line:|=','!'"
REM echo !line!
setlocal
call :replace "!line!" "!vtilda!" fline
echo 1.2 !fline!
set iline=!fline!
endlocal
)
pause
Required output should be :
Code: Select all
'100','XYC','AWER RD','12072018'
'120','BNM','PQTY RD','12082018'
'100','XYC','AWER RD','12072018'
'120','BNM','PQTY RD','12082018'
Re: Replacement of Operator
Posted: 20 Jul 2018 06:34
by Squashman
pp8771 wrote: ↑20 Jul 2018 05:03
but not for % .
Well that character should be a huge clue as to why it does not work. That character is obviously used in batch files for variable expansion so it is a special character. If you need to use a literal % character then you need to double it, whenever you need to use it as a literal to escape the variable expansion usage.
Re: Replacement of Operator
Posted: 20 Jul 2018 06:44
by pp8771
By using %% it does not work. I have tried it. Any other suggestion.
Re: Replacement of Operator
Posted: 22 Jul 2018 15:29
by Squashman
In the simplest form possible, if you want to change the delimiter of your file all you have to do is this.
Code: Select all
@echo off
set "vffname=input.txt"
SET "delim=%%"
for /F "tokens=1-4 delims=%delim%" %%G in (%vffname%) do echo '%%~G','%%~H','%%~I','%%~J'
pause