Windowsバッチファイルを使用してテキストファイルから最初の行を読み取るにはどうすればよいですか?ファイルが大きいので、最初の行だけを扱いたいと思います。
Windowsバッチファイルを使用してテキストファイルから最初の行を読み取るにはどうすればよいですか?ファイルが大きいので、最初の行だけを扱いたいと思います。
回答:
これn
は、GNUhead
ユーティリティのようなファイルから、1行だけでなく、一番上の行を印刷するための汎用バッチファイルです。
@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
例えば:
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
現在、空白行はカウントされません。また、8KBのバッチファイルの行の長さの制限も適用されます。
;
、デフォルトのFOR / FEOL文字であるセミコロンで始まる行も無視されます。10行を要求すると、空ではなく、で始まらない最初の10行が出力され;
ます。
え?imoこれははるかに簡単です
set /p texte=< file.txt
echo %texte%
ええと、皆さん...
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:\>
findstr "^1:"
、二重引用符の暖かさと保護を取得します。または、私のような引用を軽蔑し、危険な生活をfindstr /b 1:
findstr ^^1
。
set /p
ソリューションは、大きなファイルに対してはるかに効率的です。
あなたはこれを試してみるかもしれません:
@echo off
for /f %%a in (sample.txt) do (
echo %%a
exit /b
)
編集 または、4列のデータがあり、5行目から下に向かって必要な場合は、次のようにします。
@echo off
for /f "skip=4 tokens=1-4" %%a in (junkl.txt) do (
echo %%a %%b %%c %%d
)
"delims="
、スペースと一緒に完全なフォルダ名を印刷するために追加する必要がありました。
テキストファイルから最初の行を読み取るためのWindowsバッチコマンドの回答を含むthetalkingwalnutのおかげで、次の解決策を思いつきました。
@echo off
for /f "delims=" %%a in ('type sample.txt') do (
echo %%a
exit /b
)
EXIT /B
バッチファイルの一部としてより現実的には、ソリューションの問題は次のとおりです。その後、上記のバッチファイル内で後続の処理はありませんEXIT /B
。通常、バッチには1つの限られたタスクよりもはるかに多くのものがあります。
その問題に対処するには:
@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
(ただし、いわゆる毒キャラクターは依然として問題になります。)
バッチコマンドで特定の行を取得することについての詳細:
テキストファイルのn番目、最初、最後の行を取得するにはどうすればよいですか?」 http://www.netikka.net/tsneti/info/tscmd023.htm
[2012年8月28日追加]次のこともできます。
@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
(ファイルをcicleするにはfile1.txt
、file1[1].txt
、file1[2].txt
、など):
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%
そして、それは実行されています。
set /p
です。プロンプトを介して尋ねます。ただし、ファイルリダイレクトを使用する<
と、プロンプトでファイルの内容がすぐに取得されます。また、最初の行が行末で終わると、その時点でプロンプトは読み取りを停止し、変数の最初の行だけを格納します。
バッチファイルのアプローチは、DOSコマンドプロセッサの行制限に制限されることに注意してください。コマンド行の長さの制限とは何ですか?を参照してください。。
したがって、それ以上の行があるファイルを処理しようとすると、 8192文字をすると、値を保持できないため、スクリプトはそれらをスキップします。
別の方法
setlocal enabledelayedexpansion
@echo off
for /f "delims=" %%i in (filename.txt) do (
if 1==1 (
set first_line=%%i
echo !first_line!
goto :eof
))
以下を使用した回避策を次に示しますpowershell
。
powershell (Get-Content file.txt)[0]
(で行の範囲も簡単に読むことができますpowershell (Get-Content file.txt)[0..3]
)
バッチスクリプト内で変数を設定する必要がある場合は、次の行をfile.txt
使用できます。
for /f "usebackq delims=" %%a in (`powershell ^(Get-Content file.txt^)[0]`) do (set "head=%%a")