comando de lote do Windows (s) para ler a primeira linha do arquivo de texto
-
02-07-2019 - |
Pergunta
Como posso ler a primeira linha de um arquivo de texto usando um arquivo de lote do Windows? Como o arquivo é grande eu só quero lidar com a primeira linha.
Solução
Aqui está um arquivo de lote de uso geral para imprimir as linhas top n
de um arquivo como o utilitário head
GNU, em vez de apenas uma única linha.
@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
Por exemplo:
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
É atualmente não contar linhas em branco. Ele também está sujeito ao arquivo batch-comprimento da linha restrição de 8 KB.
Outras dicas
uh? imo isso é muito mais simples
set /p texte=< file.txt
echo %texte%
Uh vocês ...
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:\>
Você pode tentar dar um presente:
@echo off
for /f %%a in (sample.txt) do (
echo %%a
exit /b
)
Editar Ou, digamos que você tem quatro colunas de dados e quer a partir da 5ª linha até o fundo, tente o seguinte:
@echo off
for /f "skip=4 tokens=1-4" %%a in (junkl.txt) do (
echo %%a %%b %%c %%d
)
Graças à thetalkingwalnut com resposta lote do Windows comando (s) para ler a primeira linha do arquivo de texto eu vim com a seguinte solução:
@echo off
for /f "delims=" %%a in ('type sample.txt') do (
echo %%a
exit /b
)
Um pouco construindo sobre as respostas de outras pessoas. Agora o que lhe permite especificar o arquivo que deseja ler e a variável que deseja o posto resultado em:
@echo off
for /f "delims=" %%x in (%2) do (
set %1=%%x
exit /b
)
Isto significa que você pode usar o acima como este (supondo que você chamou de getline.bat)
c:\> dir > test-file
c:\> getline variable test-file
c:\> set variable
variable= Volume in drive C has no label.
Um forro, útil para redirecionamento stdout com ">":
@for /f %%i in ('type yourfile.txt') do @echo %%i & exit
Tente este
@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
O problema com as soluções EXIT /B
, quando mais realista dentro de um arquivo de lote como apenas uma parte do que é o seguinte. Não há tratamento posterior dentro desse arquivo de lote após a EXIT /B
. Geralmente não há muito mais para lotes do que apenas um, tarefa limitada.
Para combater esse problema:
@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
(No entanto, os chamados caracteres veneno ainda será um problema.)
Mais sobre o assunto de obter uma determinada linha com comandos de lote:
Como faço para obter o n'th, a primeira e a última linha de um arquivo de texto?" http://www.netikka.net/tsneti/info/tscmd023.htm
[Adicionado 28-Aug-2012] Um pode também ter:
@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
Aqui está uma solução usando powershell
:
powershell (Get-Content file.txt)[0]
(Você pode facilmente ler também uma gama de linhas com powershell (Get-Content file.txt)[0..3]
)
Se você precisa definir uma variável dentro de um script em lotes como a primeira linha de file.txt
você pode usar:
for /f "usebackq delims=" %%a in (`powershell ^(Get-Content file.txt^)[0]`) do (set "head=%%a")
Note, o lote arquivo aproxima será limitada ao limite de linha para o processador de comando do DOS - veja Qual é o limite de comprimento de linha de comando? .
Então, se tentar processar um arquivo que tem quaisquer linhas mais que 8192 caracteres o script só vai ignorá-los como o valor não pode ser realizada.
Outra maneira
setlocal enabledelayedexpansion
@echo off
for /f "delims=" %%i in (filename.txt) do (
if 1==1 (
set first_line=%%i
echo !first_line!
goto :eof
))
Para Cicle um arquivo (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%
E está em execução.