Làm cách nào để tôi có thể đọc dòng đầu tiên từ tệp văn bản bằng tệp loạt Windows? Vì tệp lớn nên tôi chỉ muốn xử lý dòng đầu tiên.
Làm cách nào để tôi có thể đọc dòng đầu tiên từ tệp văn bản bằng tệp loạt Windows? Vì tệp lớn nên tôi chỉ muốn xử lý dòng đầu tiên.
Câu trả lời:
Đây là một tệp hàng loạt có mục đích chung để in các n
dòng trên cùng từ một tệp như head
tiện ích GNU , thay vì chỉ một dòng.
@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
Ví dụ:
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
Nó hiện không đếm dòng trống. Nó cũng phải tuân theo giới hạn độ dài dòng của tệp loạt là 8 KB.
;
, ký tự FOR / F EOL mặc định. Nếu yêu cầu 10 dòng, thì nó sẽ in ra 10 dòng đầu tiên không trống và không bắt đầu bằng ;
.
uh? imo cái này đơn giản hơn nhiều
set /p texte=< file.txt
echo %texte%
Uh các bạn ...
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:"
và nhận được sự ấm áp và bảo vệ của dấu ngoặc kép. Hoặc, nếu bạn khinh dấu ngoặc kép như tôi và muốn sống một cách nguy hiểm, sử dụngfindstr /b 1:
findstr ^^1
.
set /p
giải pháp được thêm rất nhiều hiệu quả cho các tập tin lớn.
Bạn có thể thử cái này:
@echo off
for /f %%a in (sample.txt) do (
echo %%a
exit /b
)
chỉnh sửa Hoặc, giả sử bạn có bốn cột dữ liệu và muốn từ hàng thứ 5 trở xuống dưới cùng, hãy thử điều này:
@echo off
for /f "skip=4 tokens=1-4" %%a in (junkl.txt) do (
echo %%a %%b %%c %%d
)
"delims="
vào để in ra tên thư mục đầy đủ cùng với dấu cách.
Nhờ thetalkingwalnut với (các) lệnh hàng loạt của Windows để đọc dòng đầu tiên từ tệp văn bản, tôi đã đưa ra giải pháp sau:
@echo off
for /f "delims=" %%a in ('type sample.txt') do (
echo %%a
exit /b
)
Dựa trên câu trả lời của người khác. Giờ đây, cho phép bạn chỉ định tệp bạn muốn đọc và biến bạn muốn đưa kết quả vào:
@echo off
for /f "delims=" %%x in (%2) do (
set %1=%%x
exit /b
)
Điều này có nghĩa là bạn có thể sử dụng ở trên như thế này (giả sử bạn đã gọi nó là getline.bat)
c:\> dir > test-file
c:\> getline variable test-file
c:\> set variable
variable= Volume in drive C has no label.
Thử đi
@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
Vấn đề với các EXIT /B
giải pháp, khi thực tế hơn bên trong một tệp loạt chỉ là một phần của nó như sau. Không có quá trình xử lý tiếp theo nào trong tệp lô đã nói sau EXIT /B
. Thông thường, có nhiều thứ phải làm theo lô hơn là chỉ một nhiệm vụ giới hạn.
Để giải quyết vấn đề đó:
@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
(Tuy nhiên, những nhân vật được gọi là độc dược vẫn sẽ là một vấn đề.)
Tìm hiểu thêm về chủ đề nhận một dòng cụ thể với các lệnh hàng loạt:
Làm cách nào để lấy dòng thứ n, dòng đầu tiên và dòng cuối cùng của tệp văn bản? " Http://www.netikka.net/tsneti/info/tscmd023.htm
[Đã thêm ngày 28 tháng 8 năm 2012] Người ta cũng có thể có:
@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 một tập tin ( file1.txt
, file1[1].txt
, file1[2].txt
, vv):
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%
Và nó đang chạy.
set /p
yêu cầu thông qua một dấu nhắc; tuy nhiên với chuyển hướng tệp, <
nó ngay lập tức nhận được nội dung của tệp tại dấu nhắc; và khi dòng đầu tiên kết thúc bằng một dòng kết thúc, tại thời điểm đó lời nhắc sẽ dừng đọc và do đó chỉ lưu dòng đầu tiên trong biến.
Lưu ý, các phương pháp tiếp cận tệp hàng loạt sẽ bị giới hạn ở giới hạn dòng cho bộ xử lý lệnh DOS - hãy xem Giới hạn độ dài dòng lệnh là gì? .
Vì vậy, nếu cố gắng xử lý một tệp có bất kỳ dòng nào nhiều hơn 8192 ký tự, tập lệnh sẽ chỉ bỏ qua chúng vì giá trị không thể được giữ.
Cách khác
setlocal enabledelayedexpansion
@echo off
for /f "delims=" %%i in (filename.txt) do (
if 1==1 (
set first_line=%%i
echo !first_line!
goto :eof
))
Đây là một cách giải quyết bằng cách sử dụng powershell
:
powershell (Get-Content file.txt)[0]
(Bạn cũng có thể dễ dàng đọc một loạt các dòng với powershell (Get-Content file.txt)[0..3]
)
Nếu bạn cần đặt một biến bên trong tập lệnh lô làm dòng đầu tiên file.txt
bạn có thể sử dụng:
for /f "usebackq delims=" %%a in (`powershell ^(Get-Content file.txt^)[0]`) do (set "head=%%a")