Jak odczytać pierwszą linię z pliku tekstowego przy użyciu pliku wsadowego systemu Windows? Ponieważ plik jest duży, chcę zająć się tylko pierwszą linią.
Jak odczytać pierwszą linię z pliku tekstowego przy użyciu pliku wsadowego systemu Windows? Ponieważ plik jest duży, chcę zająć się tylko pierwszą linią.
Odpowiedzi:
Oto plik wsadowy ogólnego przeznaczenia do wydrukowania pierwszych n
wierszy z pliku takiego jak head
narzędzie GNU , zamiast tylko jednego wiersza.
@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
Na przykład:
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
Obecnie nie liczy pustych wierszy. Podlega również ograniczeniu długości wiersza pliku wsadowego do 8 KB.
;
, domyślnego znaku FOR / F EOL. Jeśli poprosisz o 10 wierszy, wydrukuje pierwsze 10 wierszy, które nie są puste i nie zaczynają się od ;
.
uh? imo to jest znacznie prostsze
set /p texte=< file.txt
echo %texte%
Uh wy ...
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:"
i zyskaj ciepło i ochronę podwójnych cudzysłowów. Lub, jeśli gardzisz cytatami takimi jak ja i chcesz żyć niebezpiecznie, użyjfindstr /b 1:
findstr ^^1
.
set /p
Rozwiązanie jest o wiele bardziej efektywne w przypadku dużych plików.
Możesz spróbować:
@echo off
for /f %%a in (sample.txt) do (
echo %%a
exit /b
)
edytuj Lub załóżmy, że masz cztery kolumny danych i chcesz od piątego wiersza do dołu, spróbuj tego:
@echo off
for /f "skip=4 tokens=1-4" %%a in (junkl.txt) do (
echo %%a %%b %%c %%d
)
"delims="
aby wydrukować pełne nazwy folderów wraz ze spacjami.
Dzięki thetalkingwalnut z odpowiedzią komendą (a) wsadową systemu Windows do odczytania pierwszej linii z pliku tekstowego wpadłem na następujące rozwiązanie:
@echo off
for /f "delims=" %%a in ('type sample.txt') do (
echo %%a
exit /b
)
Nieco opierając się na odpowiedziach innych osób. Teraz możesz określić plik, z którego chcesz odczytać i zmienną, w której chcesz umieścić wynik:
@echo off
for /f "delims=" %%x in (%2) do (
set %1=%%x
exit /b
)
Oznacza to, że możesz użyć powyższego w ten sposób (zakładając, że nazwałeś to getline.bat)
c:\> dir > test-file
c:\> getline variable test-file
c:\> set variable
variable= Volume in drive C has no label.
Spróbuj tego
@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
Problem z EXIT /B
rozwiązaniami, gdy bardziej realistycznie jest w pliku wsadowym, jako tylko jedna jego część, jest następujący. We wspomnianym pliku wsadowym nie ma żadnego dalszego przetwarzania po rozszerzeniu EXIT /B
. Zwykle partie to znacznie więcej niż jedno, ograniczone zadanie.
Aby przeciwdziałać temu problemowi:
@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
(Jednak tak zwane trujące postacie nadal będą stanowić problem.)
Więcej na temat uzyskiwania określonej linii za pomocą poleceń wsadowych:
Jak uzyskać n-ty, pierwszy i ostatni wiersz pliku tekstowego? ” Http://www.netikka.net/tsneti/info/tscmd023.htm
[Dodano 28 sierpnia 2012 r.] Można też mieć:
@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
Aby cicle plik ( file1.txt
, file1[1].txt
, file1[2].txt
, itd.):
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%
I to działa.
set /p
pyta poprzez monit; jednakże w przypadku przekierowania pliku <
natychmiast pobiera zawartość pliku po zachęcie; a ponieważ pierwsza linia kończy się końcem linii, w tym miejscu zachęta przestaje czytać, a tym samym przechowuje tylko pierwszą linię w zmiennej.
Zauważ, że podejście do pliku wsadowego będzie ograniczone do limitu linii dla procesora poleceń DOS - zobacz Jaki jest limit długości wiersza poleceń? .
Więc jeśli spróbujesz przetworzyć plik, który ma jakiekolwiek linie zawierające więcej niż 8192 znaków, skrypt po prostu je pominie, ponieważ wartość nie może być zatrzymana.
Inny sposób
setlocal enabledelayedexpansion
@echo off
for /f "delims=" %%i in (filename.txt) do (
if 1==1 (
set first_line=%%i
echo !first_line!
goto :eof
))
Oto obejście za pomocą powershell
:
powershell (Get-Content file.txt)[0]
(Możesz łatwo przeczytać również zakres wierszy za pomocą powershell (Get-Content file.txt)[0..3]
)
Jeśli chcesz ustawić zmienną w skrypcie wsadowym, jako pierwszą linię file.txt
możesz użyć:
for /f "usebackq delims=" %%a in (`powershell ^(Get-Content file.txt^)[0]`) do (set "head=%%a")
for /f "delims=" %a in (downing.txt) do echo %a & pause>nul
Drukuje pierwszą linię, a następnie czeka, aż użytkownik naciśnie klawisz, aby wydrukować następną linię. Po wydrukowaniu wymaganych linii naciśnij Ctrl + C, aby zatrzymać.
@ Ross Presser: Ta metoda drukuje tylko wiersze, a nie numery wierszy dodawane na początku.