web-dev-qa-db-ja.com

テキストファイルから最初の行を読み取るWindowsバッチコマンド

Windowsバッチファイルを使用してテキストファイルから最初の行を読み取るにはどうすればよいですか?ファイルが大きいため、最初の行のみを扱います。

75
Jesse Vogt

これは、単一行ではなく、GNU nユーティリティなどのファイルのトップhead行を出力する汎用バッチファイルです。

@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

現在、空白行はカウントされません。また、8 KBのバッチファイルの行の長さの制限も適用されます。

44
indiv

え? imoこれはずっと簡単です

  set /p texte=< file.txt  
  echo %texte%
198
Spaceballs

ええと...

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:\>
19
Amit Naidu

これを試してみてください:

@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
)
10
Ross Fuhrman

Thetalkingwalnut with answer テキストファイルから最初の行を読み取るWindowsバッチコマンド のおかげで、次の解決策を思い付きました。

@echo off
for /f "delims=" %%a in ('type sample.txt') do (
echo %%a
exit /b
)
5
Jesse Vogt

「>」を使用したstdoutリダイレクトに便利な1つのライナー:

@for /f %%i in ('type yourfile.txt') do @echo %%i & exit
3
PabloG

他の人の答えに少し基づいて作成します。これで、読み取りたいファイルと、結果を入れる変数を指定できるようになりました。

@echo off
for /f "delims=" %%x in (%2) do (
set %1=%%x
exit /b
)

これは、上記のように使用できることを意味します(getline.batと呼ばれると仮定)

c:\> dir > test-file
c:\> getline variable test-file
c:\> set variable  
variable= Volume in drive C has no label.
3
Ray Hayes

これを試して

@echo off
setlocal enableextensions enabledelayedexpansion
set firstLine=1
for /f "delims=" %%i in (yourfilename.txt) do (
    if !firstLine!==1 echo %%i
    set firstLine=0
)
endlocal
1
Sarath Avanavu

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
1
Timo Salmi

バッチファイルのアプローチは、DOSコマンドプロセッサの行の制限に制限されることに注意してください- コマンドラインの長さの制限とは? を参照してください。

そのため、8192文字を超える行があるファイルを処理しようとすると、スクリプトは値を保持できないため、それらをスキップします。

0
kevinjansz

ファイルを凍結するには(file1.txtfile1[1].txtfile1[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%

そして実行中です。

0
Laercio

別の方法

setlocal enabledelayedexpansion
@echo off
for /f "delims=" %%i in (filename.txt) do (
if 1==1 (
set first_line=%%i
echo !first_line!
goto :eof
))
0
hhay

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")
0
mmj