텍스트 파일에서 첫 번째 줄을 읽는 Windows 배치 명령


84

Windows 배치 파일을 사용하여 텍스트 파일에서 첫 줄을 어떻게 읽을 수 있습니까? 파일이 크므로 첫 번째 줄만 처리하고 싶습니다.


1
GNU32 "head"유틸리티를 사용해보십시오. 당신이 추구하는 것이 DOS Batch만으로 쉽게 성취 될 것이라고 생각하지 마십시오.
Nasir

@Nasir, 내장 명령으로 할 수 없습니까?
Prajwal Dhatwalia

답변:


48

다음 은 한 줄이 아닌 nGNU 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

현재는 빈 줄을 계산하지 않습니다. 또한 8KB의 배치 파일 행 길이 제한이 적용됩니다.


10
참고 : "GOTO : EOF"특수 ": exit"레이블을 정의하지 않고 스크립트를 종료하는 특수 레이블입니다. 배치에서 서브 루틴을 정의 할 때도 유용합니다 (당신이 말하는 것은 무엇입니까? 서브 루틴? 예)
Steven

4
이것은 내 여러 GB 텍스트 파일에서 폭발하는 것 같습니다 ... 한 파일에서는 10 줄을 반환하려고 할 때 "Out of Memory"오류가 발생하고 다른 파일에서는 반환을 요청할 때 빈 줄 하나만 반환했습니다. 10 줄. 왜 이런 일이 발생하는지 아이디어가 있습니까?
Dan

1
@ 댄-라인이 얼마나 되나요? FOR / F는 8191 바이트보다 긴 줄을 "무시"합니다. 하지만 정말 긴 줄을 만나면 "메모리 부족"오류가 발생하는지 궁금합니다.
dbenham

@StephanMuller-위의 Dan에게 내 댓글 참조
dbenham

작성된 대로이 답변은 빈 줄을 무시합니다. 또한 ;기본 FOR / F EOL 문자 인 세미콜론으로 시작하는 행을 무시 합니다. 10 줄을 요청하면 비어 있지 않고로 시작하지 않는 처음 10 줄을 인쇄합니다 ;.
dbenham

224

어? imo 이것은 훨씬 더 간단합니다

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

16
+1, 작동 할 때 가장 좋습니다.-) 다음과 같은 제한이 있습니다. 1) EOL을 포함하지 않는 최대 라인 길이는 1021 바이트입니다. 2) 파일은 CarriageReturn LineFeed의 Windows 스타일 EOL을 사용해야합니다. 3) 후행 제어 문자는 줄에서 제거됩니다
dbenham

4
또한 첫 번째 줄이 비어있는 경우 파일을 읽기 전에 texte를 명시 적으로 정의 해제해야합니다.
dbenham

다음 은 줄을 다듬기위한 몇 가지 추가 팁입니다. echo %texte:~3%예를 들어 처음 세 문자를 건너 뜁니다. BOM이있는 UTF-8 파일을 읽을 때 유용합니다.
KargWare

22

너희들 ...

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:\>

2
파일에 11 개 이상의 행이있는 경우 1 :, 11 :, 21 : 등과 같이 첫 번째 행보다 더 많이 인쇄됩니다.
Cesar Romero

1
세자르 잘 잡아! 나는 항상 따옴표가 나를 짜증나게하기 때문에 피하려고 노력하지만,이 경우에는 그것은 나쁜 생각이었다. 수정하려면 findstr "^1:"큰 따옴표의 따뜻함과 보호를 변경 하고 얻으십시오. 또는 나 같은 인용문을 경멸하고 위험하게 살고 싶다면findstr /b 1:
Amit Naidu

4
따옴표없이 / b 옵션없이 원하는 경우 캐럿을 이스케이프하십시오 : findstr ^^1.
dbenham

그레이트 힌트 dbenham, cmd의 이스케이프는 항상 나를 피합니다. 그건 그렇고, 대용량 파일에는이 방법을 사용하지 마십시오. 실제로 전체 파일을 읽고 매우 비효율적입니다. 이 솔루션에 대한 유일한 기준은 A) 한 줄이어야합니다. B) 복사-붙여 넣기가 아닌 메모리 및 입력에서 쉽게 기억하거나 다시 만들어야합니다. C) 외부 도구가 없습니다. 이 set /p솔루션은 대용량 파일에 훨씬 더 효율적입니다.
Amit Naidu

2
또한 실제로 원하는 텍스트 줄 앞에 줄 번호를 추가합니다! 따라서 텍스트가 필요할 때 그다지 유용하지 않습니다.
Ross Presser

11

이것을 시도해 볼 수 있습니다.

@echo off

for /f %%a in (sample.txt) do (
  echo %%a
  exit /b
)

편집 또는 네 개의 데이터 열이 있고 5 번째 행에서 아래로 내려 가고 싶다면 다음을 시도해보세요.

@echo off

for /f "skip=4 tokens=1-4" %%a in (junkl.txt) do (
  echo %%a %%b %%c %%d
)

1
이것은 나에게 필요한 단서를 주었지만 옳지 않았습니다. 적절한 절차가 무엇인지 확실하지 않지만이 솔루션을 최종 솔루션에 통합했습니다. stackoverflow.com/questions/130116#130209
Jesse Vogt

2
이 솔루션의 문제는 개행 대신 공백으로 구분하고 공백이있는 파일 이름을 가질 수 없다는 것입니다. for 루프의 delims 및 usebackq 옵션을 사용하여 이러한 문제를 해결할 수 있습니다.
indiv

나를 위해 일했지만 "delims="공백과 함께 전체 폴더 이름을 인쇄 하려면 추가 해야했습니다.
GChuf


4

다른 사람들의 대답을 약간 기반으로합니다. 이제 읽을 파일과 결과를 넣을 변수를 지정할 수 있습니다.

@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

">"를 사용하는 표준 출력 리디렉션에 유용한 라이너 1 개 :

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

2

이 시도

@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

EXIT /B솔루션 의 문제 는 배치 파일의 일부로 더 현실적으로 내부에있을 때 다음과 같습니다. 이후에 해당 배치 파일 내에서 후속 처리가 없습니다 EXIT /B. 일반적으로 배치에는 하나의 제한된 작업보다 훨씬 많은 것이 있습니다.

그 문제에 대응하려면 :

@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

set / p texte = <file.txt는 아마도 제시된 가장 멋진 솔루션 일 것입니다. @Spaceballs의이 스레드에서. 일반적으로 나는 set / p "texte"= < "file.txt"라고 썼지 만 요점을 벗어났습니다. 이 솔루션조차도 독 문자 문제가 발생하기 쉽습니다. 즉, file.txt에 포함 된 내용에 따라 실패 할 수 있습니다.
Timo Salmi 2012

1

(파일을 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프롬프트를 통해 묻습니다. 그러나 파일 리디렉션 <을 사용하면 프롬프트에서 파일 내용을 즉시 가져옵니다. 첫 번째 줄이 줄 끝으로 끝나는 시점에서 프롬프트는 읽기를 멈추고 변수에 첫 번째 줄만 저장합니다.
sdbbs

0

배치 파일 접근 방식은 DOS 명령 프로세서의 줄 제한으로 제한됩니다 . 명령 줄 길이 제한무엇입니까?를 참조하십시오 . .

따라서 8192 자 이상의 줄이있는 파일을 처리하려고 하면 값을 유지할 수 없으므로 스크립트 는 해당 줄을 건너 뜁니다.


0

또 다른 방법

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

2
.bat 파일을 최후의 수단으로 만 사용하는 것이 좋습니다. 가능하다면 항상 "실제"스크립팅 언어를 사용하십시오 : Powershell, WSH, Python ... ANYTHING 그러나 .bat 파일.
paulsm4

2
일괄없는 (당신이 알고있을 때 당신이 무엇을, 다른 모든 언어와 동일) 나쁜. hhay : 코드가 작동하지 않습니다.
Stephan

당신은 사용하지 않기 때문에 지연 확장
스테판

1
@ paulsm4 : 배치 파일의 문제점은 무엇입니까? Windows의 모든 버전에서 작동하며 지연된 확장이라는 고유 한 기능이있어 이해하는 한 타사 소프트웨어를 설치하지 않고도 마술이 일어날 수 있습니다. Powershell 및 dotNet보다 오래 전에 DOS 및 배치 파일에서 TCP / IP를 사용할 수 있다는 것을 알고 계셨습니까?
Zimba 2011

0

다음을 사용하는 해결 방법은 다음과 같습니다 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")

Powershell이 ​​매우 느림
Anic17

-1

for /f "delims=" %a in (downing.txt) do echo %a & pause>nul

첫 번째 줄을 인쇄 한 다음 사용자가 키를 눌러 다음 줄을 인쇄 할 때까지 기다립니다. 필요한 줄을 인쇄 한 후 Ctrl + C를 눌러 중지합니다.

@Ross Presser :이 방법은 줄 번호 앞에 추가하지 않고 줄만 인쇄합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.