bhavik sanghvi
bhavik sanghvi

Reputation: 105

How to find total commas in the first line of a file?

I want create a batch file to find the total number of commas in the first line of text file.

Sample Text File input.txt

12345,Bhavik
12323,Bhavik,Sanghvi

Output

1

I tried to surf net for this but couldnt find a solution, please help

Upvotes: 0

Views: 268

Answers (5)

foxidrive
foxidrive

Reputation: 41244

Here's another simple solution to this question.

@echo off
setlocal enabledelayedexpansion
set LF=^


::Above 2 blank lines are critical - do not remove
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
set /p var=<input.txt
echo "%var:,="!cr!!lf!"..***..%">temp.file
find /c "..***.." <temp.file
del temp.file

Upvotes: 1

Aacini
Aacini

Reputation: 67216

@echo off
setlocal EnableDelayedExpansion

rem Read the first line
set /P "line=" < input.txt

rem Store it in a text file
> before.txt echo !line!

rem Store the line without commas in a second file
> after.txt echo !line:,=!

rem Get the difference in sizes between both files
set "diff="
for %%a in (before.txt after.txt) do (
   if not defined diff (
      set "diff=%%~Za"
   ) else (
      set /A "diff-=%%~Za"
   )
)
del before.txt after.txt

echo %diff%

Upvotes: 0

JosefZ
JosefZ

Reputation: 30123

Next solution (similar to Magoo's second method) seems to treat even ˙cmd˙ and .bat poisonous characters supposed in input file:

@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
set "infile=D:\bat\SO\files\35826440input.txt"   change to suit your circumstances
set /A "commacount=-1"
for /F "usebackq delims=" %%G in ("%infile%") do (
  set "line=%%G"
  call :parseline
  if /I not "%~1"=="/all" goto :continue
) 
:continue
echo script continues here
ENDLOCAL
exit /B

:parseline
  rem treat unbalanced doublequote in next line
  set "lineToParse=%line:"=§%"
  set "lineToParse=%lineToParse:,=","%"
  set /A "commacount=-1"
  for %%g in ("%lineToParse%") do (
    set /A "commacount+=1"
    rem echo %line%, !commacount!, %%g    
  )
  echo %commacount% "%line%"
goto :eof

Output (with input file listing):

==> D:\bat\SO\35826440.bat
1 "12345,Bhavik"
script continues here

==> D:\bat\SO\35826440.bat /all
1 "12345,Bhavik"
2 "12323,Bhavik,Sanghvi"
3 "12323,Bhavik,Sanghvi,three"
0 "zero"
1 ",1 leading"
2 ",,2 leading"
1 "trailing,"
2 "2 trailing,,"
2 "2 middle,,mid"
4 "!OS!,!,!!,!!!,exclamations"
4 "%OS%,%,%%%,%%,percents"
8 "&,|,>,<,",",;,=,miscelaneous"
0 "unbalanced"doublequote"
script continues here

==> type D:\bat\SO\files\35826440input.txt
12345,Bhavik
12323,Bhavik,Sanghvi
12323,Bhavik,Sanghvi,three
zero
,1 leading
,,2 leading
trailing,
2 trailing,,
2 middle,,mid
!OS!,!,!!,!!!,exclamations
%OS%,%,%%%,%%,percents
&,|,>,<,",",;,=,miscelaneous
unbalanced"doublequote

==>

Upvotes: 0

Magoo
Magoo

Reputation: 80033

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q35826440.txt"
:: first method
SET /a count=0
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO SET "line=%%a"&GOTO got1
:got1
SET "line=%line:"=%"
IF NOT DEFINED line ECHO method 1: %count% found&GOTO method2
IF "%line:~-1%"=="," SET /a count+=1
SET "line=%line:~0,-1%"
GOTO got1
:: second method
:method2
SET /a count=-1
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO SET "line=%%a"&GOTO got2
:got2
SET "line=%line:"=%"
SET "line=%line:;=%"
SET "line=%line: =%"
SET "line=%line:,=x,x%"
FOR %%a IN (%line%) DO SET /a count+=1
ECHO method 2: %count% found

GOTO :EOF 

You would need to change the setting of sourcedir to suit your circumstances.

I used a file named q35826440.txt containing your data for my testing.

Two methods - both read the first line to line, then removes any " characters.

The first then mechanically loops, checking whether the last character is a comma, counting if it is and removing the last character until the string found is empty.

The second replaces all ; and Space characters (for good measure, Tab could be removed too) and then replacing commas with x,x.

The result is that the only separators left are commas, and there will be 1 more item in the list so formed than there are commas.

Hence, start the counter at -1 and increment for each element found in the list.

Upvotes: 0

Mark Setchell
Mark Setchell

Reputation: 207540

If, rather than being hampered by the awful Windows BATCH tools, you install awk from the Unix tools for Windows here, you can do this:

awk -F, 'NR==1{print NF-1;exit}' input.txt

That says... "Run awk and use commas as the separator to divide fields. On line 1, print the number of fields on this line minus 1, then exit. Do that for file input.txt."

gawk is just a slightly different version of awk if you get that one in the Unix Utils package. You may need to replace the single quotes with double ones to accommodate Windows' lack of abilities.

Upvotes: 0

Related Questions