Làm thế nào bạn có thể đọc một tệp (văn bản hoặc nhị phân) từ một tệp hàng loạt? Có một cách để đọc nó ở chế độ nhị phân hoặc chế độ văn bản?
TYPE [fileName]
cho MS-Dos.
Làm thế nào bạn có thể đọc một tệp (văn bản hoặc nhị phân) từ một tệp hàng loạt? Có một cách để đọc nó ở chế độ nhị phân hoặc chế độ văn bản?
TYPE [fileName]
cho MS-Dos.
Câu trả lời:
Bạn có thể sử dụng lệnh for:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
Kiểu
for /?
tại dấu nhắc lệnh. Ngoài ra, bạn có thể phân tích cú pháp các tệp ini !
for /?
lệnh sẽ phân tích cú pháp từng dòng trong myfile.txt, bỏ qua các dòng bắt đầu bằng dấu chấm phẩy, chuyển mã thông báo thứ 2 và thứ 3 từ mỗi dòng đến phần thân for, với các mã thông báo được phân tách bằng dấu phẩy và / hoặc dấu cách.
Trong cmd.exe kiểu NT, bạn có thể lặp qua các dòng của tệp văn bản với
FOR /F %i IN (file.txt) DO @echo %i
Nhập "help for" trên dấu nhắc lệnh để biết thêm thông tin. (không biết nếu điều đó hoạt động trong bất kỳ "DOS" nào bạn đang sử dụng)
%%i
.
FOR-LOOP thường hoạt động, nhưng có một số vấn đề. FOR không chấp nhận các dòng trống và các dòng có hơn ~ 8190 là vấn đề. Việc mở rộng chỉ hoạt động đáng tin cậy, nếu tính năng mở rộng bị trì hoãn bị tắt.
Việc phát hiện CR / LF so với LF đơn có vẻ cũng hơi phức tạp.
Ngoài ra, các ký tự NUL cũng có vấn đề, vì Vòng lặp FOR ngay lập tức hủy việc đọc.
Do đó, đọc nhị phân trực tiếp dường như gần như không thể.
Vấn đề với các dòng trống có thể được giải quyết bằng một mẹo nhỏ. Bắt đầu mỗi dòng bằng số dòng, sử dụng lệnh findstr và sau khi đọc, hãy xóa tiền tố.
@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t.txt"`) do (
set "var=%%a"
SETLOCAL EnableDelayedExpansion
set "var=!var:*:=!"
echo(!var!
ENDLOCAL
)
Chuyển đổi giữa bật và tắt mở rộng bị trì hoãn là điều cần thiết để làm việc an toàn với các chuỗi, như !
hoặc ^^^xy!z
.
Đó là vì dòng set "var=%%a"
chỉ an toàn với DisabledDelayedExpansion , các dấu chấm than khác sẽ bị xóa và dấu mũ được sử dụng làm ký tự thoát (phụ) và chúng cũng bị xóa.
Nhưng việc sử dụng biến var
chỉ an toàn với EnabledDelayedExpansion , vì ngay cảcall %%var%%
sẽ không thành công với nội dung như "&"&
.
CHỈNH SỬA: Đã thêm biến thể set / p
Có một cách thứ hai để đọc tệp set /p
, nhược điểm duy nhất là nó bị giới hạn ở ~ 1024 ký tự mỗi dòng và nó loại bỏ các ký tự điều khiển ở cuối dòng.
Nhưng ưu điểm là, bạn không cần chuyển đổi chậm trễ và việc lưu trữ giá trị trong các biến dễ dàng hơn
@echo off
setlocal EnableDelayedExpansion
set "file=%~1"
for /f "delims=" %%n in ('find /c /v "" %file%') do set "len=%%n"
set "len=!len:*: =!"
<%file% (
for /l %%l in (1 1 !len!) do (
set "line="
set /p "line="
echo(!line!
)
)
Để đọc nó "nhị phân" thành một biểu diễn hex,
Bạn có thể xem SO: chuyển đổi tệp nhị phân thành biểu diễn HEX bằng cách sử dụng tệp loạt
set /p
. Tôi đã sử dụng set /p value=< result.txt
lấy dòng đầu tiên từ một tệp văn bản
0x1A
thì sao? có for /F
hoạt động giống như với các ký tự NUL ( 0x00
) không?
:
hoặc ;
hoặc chứa!
Một cách rất dễ thực hiện là sử dụng lệnh sau:
set /p mytextfile=< %pathtotextfile%\textfile.txt
echo %mytextfile%
Thao tác này sẽ chỉ hiển thị dòng văn bản đầu tiên trong tệp văn bản. Cách khác bạn có thể làm là sử dụng lệnh sau:
type %pathtotextfile%\textfile.txt
Thao tác này sẽ đưa tất cả dữ liệu trong tệp văn bản lên màn hình. Hi vọng điêu nay co ich!
Có rất nhiều cách khác nhau nhưng nếu bạn chỉ muốn HIỂN THỊ văn bản và không lưu trữ nó ở bất kỳ đâu thì bạn chỉ cần sử dụng: findstr /v "randomtextthatnoonewilluse" filename.txt
Đã sửa mã:
setlocal enabledelayedexpansion
for /f "usebackq eol= tokens=* delims= " %%a in (`findstr /n ^^^^ "name with spaces.txt"`) do (
set line=%%a
set "line=!line:*:=!"
echo(!line!
)
endlocal
pause
eol=
và delims=
là không cần thiết, set line=%%a
nên sử dụng dấu ngoặc kép và không có chuyển đổi qua lại chế độ mở rộng chậm, mã không thể đọc dấu chấm than
Mã hiển thị nội dung của tệp myfile.txt trên màn hình
set% filecontent% = 0
type% filename% >>% filecontent%
echo% filecontent%