How can I read the first line from a text file using a Windows batch file? Since the file is large I only want to deal with the first line.
15 Answers
Here's a general-purpose batch file to print the top n
lines from a file like the GNU head
utility, instead of just a single line.
@echo off
if [%1] == [] goto usage
if [%2] == [] goto usage
call :print_head %1 %2
goto :eof
REM
REM print_head
REM Prints the first non-blank %1 lines in the file %2.
REM
:print_head
setlocal EnableDelayedExpansion
set /a counter=0
for /f ^"usebackq^ eol^=^
^ delims^=^" %%a in (%2) do (
if "!counter!"=="%1" goto :eof
echo %%a
set /a counter+=1
)
goto :eof
:usage
echo Usage: head.bat COUNT FILENAME
For example:
Z:\>head 1 "test file.c"
; this is line 1
Z:\>head 3 "test file.c"
; this is line 1
this is line 2
line 3 right here
It does not currently count blank lines. It is also subject to the batch-file line-length restriction of 8 KB.
Thanks to thetalkingwalnut with answer Windows batch command(s) to read first line from text file I came up with the following solution:
@echo off
for /f "delims=" %%a in ('type sample.txt') do (
echo %%a
exit /b
)
Slightly building upon the answers of other people. Now allowing you to specify the file you want to read from and the variable you want the result put into:
@echo off
for /f "delims=" %%x in (%2) do (
set %1=%%x
exit /b
)
This means you can use the above like this (assuming you called it getline.bat)
c:\> dir > test-file
c:\> getline variable test-file
c:\> set variable
variable= Volume in drive C has no label.
The problem with the EXIT /B
solutions, when more realistically inside a batch file as just one part of it is the following. There is no subsequent processing within the said batch file after the EXIT /B
. Usually there is much more to batches than just the one, limited task.
To counter that problem:
@echo off & setlocal enableextensions enabledelayedexpansion
set myfile_=C:\_D\TEST\My test file.txt
set FirstLine=
for /f "delims=" %%i in ('type "%myfile_%"') do (
if not defined FirstLine set FirstLine=%%i)
echo FirstLine=%FirstLine%
endlocal & goto :EOF
(However, the so-called poison characters will still be a problem.)
More on the subject of getting a particular line with batch commands:
How do I get the n'th, the first and the last line of a text file?" http://www.netikka.net/tsneti/info/tscmd023.htm
[Added 28-Aug-2012] One can also have:
@echo off & setlocal enableextensions
set myfile_=C:\_D\TEST\My test file.txt
for /f "tokens=* delims=" %%a in (
'type "%myfile_%"') do (
set FirstLine=%%a& goto _ExitForLoop)
:_ExitForLoop
echo FirstLine=%FirstLine%
endlocal & goto :EOF
Here is a workaround using powershell
:
powershell (Get-Content file.txt)[0]
(You can easily read also a range of lines with powershell (Get-Content file.txt)[0..3]
)
If you need to set a variable inside a batch script as the first line of file.txt
you may use:
for /f "usebackq delims=" %%a in (`powershell ^(Get-Content file.txt^)[0]`) do (set "head=%%a")
Note, the batch file approaches will be limited to the line limit for the DOS command processor - see What is the command line length limit?.
So if trying to process a file that has any lines more that 8192 characters the script will just skip them as the value can't be held.
In Windows PowerShell below cmd can be used to get the first line and replace it with a static value
powershell -Command "(gc txt1.txt) -replace (gc txt1.txt)[0], 'This is the first line' | Out-File -encoding ASCII txt1.txt"
Reference
How can you find and replace text in a file using the Windows command-line environment?
Print 1st line only (no need to read entire file):
set /p a=< file.txt & echo !a!
To print 1st line, then wait for user to press a key for next line:
(After printing required lines, press Ctrl+C to stop.)
for /f "delims=" %a in (downing.txt) do echo %a & pause>nul
To print 1st n lines (without user key presses):
type nul > tmp & fc tmp "%file%" /lb %n% /t | find /v "*****" | more +2
Tested on Win 10 CMD.