Hàng loạt tệp: Làm thế nào để đọc một tệp?


97

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?


@ RookieTEC9: vâng, tôi biết rằng chúng là 2 thứ hoàn toàn khác nhau, nhưng tôi cần một câu trả lời hoạt động trong msdos, không phải windows nt (hoặc các phiên bản mới hơn), câu hỏi này cũng đã được hỏi cách đây 7 năm, hãy ghi nhớ điều đó
Lucas Gabriel Sánchez

@ RookieTEC9: Tôi nghĩ bạn nói đúng, đã lâu rồi. Tôi sẽ chỉ xóa thẻ ms-dos
Lucas Gabriel Sánchez.

1
Bạn có thể sử dụng lệnh TYPE [fileName]cho MS-Dos.
RookieTEC9

hãy thử điều này, nó có hiệu quả với tôi - stackoverflow.com/a/31919715/4534414
Anurag_BEHS

Câu trả lời:


40

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 !


25
Đây là một ví dụ khá phức tạp, phân tích cú pháp thông tin rất cụ thể từ một tệp văn bản được định dạng đặc biệt mà không đưa ra bất kỳ lời giải thích nào. Theo 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.
Martin Prikryl

2
Ví dụ của bạn là từ sự trợ giúp của cmd.exe. Bạn nên thêm một gợi ý cho điều đó hoặc sao chép toàn bộ mô tả.
Th. Thielemann

70

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)


22
Nó nên được %%i.
Jim Fell,

32
Lệnh này sẽ bỏ đọc một dòng nếu nó tìm thấy một ký tự khoảng trắng. Cuối cùng tôi đã sử dụng FOR / F "tokens = *" %% i IN (file.txt) DO @ECHO %% i
Jason

9
Nó hoạt động! và Nếu bạn đang sử dụng bảng điều khiển, hãy thử% i nếu bạn đang sử dụng tệp bat thì hãy thử %% i.
Steven Du

41

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 varchỉ 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


Cảm ơn cho con trỏ về việc sử dụng set /p. Tôi đã sử dụng set /p value=< result.txtlấy dòng đầu tiên từ một tệp văn bản
SteveC

Jeb, tôi hỏi một câu hỏi liên quan dựa trên giải pháp của bạn ở trên trong stackoverflow.com/questions/11408295/...
Nicholas

Còn ký tự EOF (cuối tệp), ASCII 0x1Athì sao? có for /Fhoạt động giống như với các ký tự NUL ( 0x00) không?
aschipfl

@aschipfl Tôi cho rằng 0x1A hoạt động trong một số trường hợp giống như một dòng cấp dữ liệu (hoặc tốt hơn nó được dịch thành một dòng cấp dữ liệu). Có cách nào để tạo SUB mà không cần sử dụng tệp tạm thời không?
jeb

đây phải là câu trả lời được chấp nhận, nó hoàn toàn tuyệt vời ngay cả khi các dòng bắt đầu bằng :hoặc ;hoặc chứa!
HackingAddict1337

10

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!


1

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


0

Đã 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

Trong mã chính của trang. Dấu ngoặc kép không được đặt đúng vị trí, mã không phù hợp với các tệp có tên có dấu cách. Của tôi là. Tôi đưa ra đây mẹo của ^^^^
Celes

Bạn nói đúng với dấu ngoặc kép quanh tên tập tin, nhưng mã của bạn có một số vấn đề: eol=delims=là không cần thiết, set line=%%anê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
Jeb

-1
set a=type 1.csv

Điều này sẽ lưu trữ nội dung của 1.csv thành biến 'a':

nhập mô tả hình ảnh ở đây


2
không lưu trữ nội dung của tệp trong biến mà là lệnh type 1.csv, vì vậy %a%chỉ cần thực hiện lệnh đó. Xác minh vớiset a
Stephan

-5

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%


3
vui lòng ít nhất hãy thử mã trước khi đăng. Đó chỉ là điều vô nghĩa.
Stephan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.