2012-10-22 45 views
5

Tôi đang cố gắng đọc từng dòng từ một tệp văn bản sử dụng hàng loạt.Đọc các dòng có khoảng trắng từ một tệp bằng cách sử dụng hàng loạt

Các đường bên trong các tập tin có một số khoảng trống, vì vậy đây là một ví dụ về đầu vào:

This is the first line 
This is the second line 
... 

Tôi đang sử dụng mã nguồn sau

FOR /f %%a in ("%1") do (
    @echo %%a 
) 
goto:eof 

Đầu ra là người theo dõi:

This 
This 
... 

Tôi đã đọc cho mục nhập llowing trong Stack Overflow nhưng không giải quyết được vấn đề của tôi. Batch : read lines from a file having spaces in its path

+0

Giả sử '% 1' là tên tệp của bạn, khi đó mã được đăng của bạn không thể hoạt động như bạn mô tả. Hoặc bạn phải sử dụng tùy chọn '" usebackq "', nếu không mệnh đề IN() của bạn không được trích dẫn. – dbenham

Trả lời

6

hãy thử điều này.

FOR /f "tokens=* delims=," %%a in ('type "%1"') do (
    @echo %%a 
) 
+2

Bây giờ mã sẽ cắt mỗi dòng tại lần xuất hiện đầu tiên của ','. – dbenham

2

Bạn cần phải thiết lập delimiter của bạn cho nơi hàng loạt đọc lên đến trên mỗi dòng

FOR /f "delims=;" %%a in ("%1") do (
    @echo %%a 
) 

Delimiter mặc định cho sự kết thúc của dòng là một dấu hai chấm bán. Hoặc sử dụng một ký tự mà bạn không thể thấy trong tệp như ~ hoặc ¬ hoặc một cái gì đó.

+0

Tại sao đặt dấu phân tách thành giá trị lạ, tại sao không đơn giản là đặt nó thành không có gì? – jeb

+0

@jeb Làm thế nào để bạn đặt nó thành không có gì? '" delims = "' sẽ đặt nó thành không gian như mặc định đúng không? –

+0

Không, như dbenham hiển thị, '" delims = "' đặt nó thành không có gì, chỉ EOL không thể được đặt theo cách này thành một giá trị rỗng, '" EOL = "' sẽ đặt EOL thành một câu trích dẫn. Nhưng EOL có thể trống bằng các cách khác – jeb

3

Bali C và Henry Gao váy xung quanh vấn đề.

Mã của bạn đang chấm dứt giá trị tại không gian thứ nhất vì FOR/F được thiết kế để phân tích cú pháp một chuỗi thành các mã thông báo phân tách. Các dấu phân cách mặc định là không gian và tab. Bạn có thể bảo toàn toàn bộ dòng bằng cách đặt DELIMS thành không có gì.

for /f "usebackq delims=" %%a in ("%~1") do echo %%a 

Nhưng vẫn còn những vấn đề tiềm năng: FOR/F vòng bỏ qua dòng sản phẩm nào, và cũng có thể bỏ qua dòng bắt đầu với nhân vật EOL (; theo mặc định).

Lệnh FOR (đặc biệt là biến thể FOR/F) là một con thú phức tạp. Tôi khuyên bạn nên đọc http://judago.webs.com/batchforloops.htm để có bản tóm tắt tốt về các ngóc ngách và crannies của lệnh FOR.

+0

Nỗi buồn. Liên kết không còn hoạt động .. –

Các vấn đề liên quan