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.
-
1Try GNU32 "head" utility. Don't think what you are after will be easily accomplished by just DOS Batch.Nasir– Nasir2008-09-24 21:42:55 +00:00Commented Sep 24, 2008 at 21:42
-
@Nasir , Can't it be done with an inbuilt command?Prajwal– Prajwal2019-07-12 05:00:42 +00:00Commented Jul 12, 2019 at 5:00
16 Answers
uh? imo this is much simpler
set /p texte=< file.txt
echo %texte%
4 Comments
The syntax of the command is incorrect. First line was #include <iostream>. So, apparently, < and > symbol break this... Not the most robust solution.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.
7 Comments
;, the default FOR /F EOL character. If asking for 10 lines, then it will print the first 10 lines that are not empty and do not begin with ;.Uh you guys...
C:\>findstr /n . c:\boot.ini | findstr ^1:
1:[boot loader]
C:\>findstr /n . c:\boot.ini | findstr ^3:
3:default=multi(0)disk(0)rdisk(0)partition(1)\WINNT
C:\>
7 Comments
findstr "^1:" and gain the warmth and protection of double quotes. Or, if you despise quotes like me and want to live dangerously, use findstr /b 1:findstr ^^1.set /p solution is far more efficient for large files.You might give this a try:
@echo off
for /f %%a in (sample.txt) do (
echo %%a
exit /b
)
edit Or, say you have four columns of data and want from the 5th row down to the bottom, try this:
@echo off
for /f "skip=4 tokens=1-4" %%a in (junkl.txt) do (
echo %%a %%b %%c %%d
)
3 Comments
"delims=" to print out full folder names together with spaces.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
)
Comments
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.
Comments
To cicle a file (file1.txt, file1[1].txt, file1[2].txt, etc.):
START/WAIT C:\LAERCIO\DELPHI\CICLADOR\dprCiclador.exe C:\LAERCIUM\Ciclavel.txt
rem set/p ciclo=< C:\LAERCIUM\Ciclavel.txt:
set/p ciclo=< C:\LAERCIUM\Ciclavel.txt
rem echo %ciclo%:
echo %ciclo%
And it's running.
1 Comment
set /p asks through a prompt; however with file redirection < it immediately gets the contents of the file at the prompt; and as the first line ends with a line ending, at that point the prompt stops reading, and thus stores just the first line in the variable.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")
To test it create a text file test.txt with at least a couple of lines and in the same folder run the following batch file (give to the file the .bat extension):
@echo off
for /f "usebackq delims=" %%a in (`powershell ^(Get-Content test.txt^)[0]`) do (set "head=%%a")
echo Hello
echo %head%
echo End
pause
In the command prompt window that will open, provided that the content of first line of test.txt is line 1, you will see
Hello
line 1
End
Press any key to continue . . .
Another way
setlocal enabledelayedexpansion
@echo off
for /f "delims=" %%i in (filename.txt) do (
if 1==1 (
set first_line=%%i
echo !first_line!
goto :eof
))
4 Comments
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
1 Comment
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.
Comments
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?
Comments
Print 1st line only (no need to read entire file):
set /p a=< file.txt & echo !a!
To print one line at a time; 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 intervention):
type nul > tmp & fc tmp "%file%" /lb %n% /t | find /v "?" | more +2
Tested on Win 10 CMD.