2013-07-14 51 views
5

Làm cách nào để xóa một dòng cụ thể, duy nhất khỏi tệp văn bản? Ví dụ dòng thứ ba, hoặc bất kỳ dòng nào khác. Tôi đã thử điều này:Xóa một dòng cụ thể trong một tệp văn bản?

line = 2 
file = File.open(filename, 'r+') 
file.each { last_line = file.pos unless file.eof? } 
file.seek(last_line, IO::SEEK_SET) 
file.close 

Thật không may, nó không có gì. Tôi đã thử rất nhiều giải pháp khác, nhưng không có gì hiệu quả.

+0

phải được đặt tại chỗ? – tokland

+0

ý của bạn là "inplace"? – bugerrorbug

+1

Bạn có thể sửa đổi tệp hiện có (đó là bản cập nhật tại chỗ) hoặc tạo tệp mới. Cách tiếp cận cuối cùng này thường được ưu tiên vì nó không phá hủy. Kiểm tra ví dụ 'sed' có hoặc không có tùy chọn' -i'. – tokland

Trả lời

8

Tôi nghĩ bạn không thể làm điều đó một cách an toàn do giới hạn hệ thống tệp.

Nếu bạn thực sự muốn thực hiện chỉnh sửa tại chỗ, bạn có thể thử ghi vào bộ nhớ, chỉnh sửa và sau đó thay thế tệp cũ. Nhưng hãy cẩn thận rằng có ít nhất hai vấn đề với cách tiếp cận này. Đầu tiên, nếu chương trình của bạn dừng ở giữa viết lại, bạn sẽ nhận được một tệp không đầy đủ. Thứ hai, nếu tệp của bạn quá lớn, nó sẽ ăn bộ nhớ của bạn.

file_lines = '' 

IO.readlines(your_file).each do |line| 
    file_lines += line unless <put here your condition for removing the line> 
end 

<extra string manipulation to file_lines if you wanted> 

File.open(your_file, 'w') do |file| 
    file.puts file_lines 
end 

cái gì đó dọc đường đó sẽ làm việc, nhưng sử dụng một tập tin tạm thời là một an toàn hơn nhiều và các cách tiếp cận tiêu chuẩn

require 'fileutils' 

File.open(output_file, "w") do |out_file| 
    File.foreach(input_file) do |line| 
    out_file.puts line unless <put here your condition for removing the line> 
    end 
end 

FileUtils.mv(output_file, input_file) 

tình trạng của bạn có thể là bất cứ điều gì cho thấy nó là dòng không mong muốn, như, file_lines += line unless line.chomp == "aaab" ví dụ: sẽ xóa dòng "aaab".

+0

Tôi đánh giá cao bạn làm việc Doodad, nhưng không có giải pháp của bạn làm việc. Nó cho tôi một lỗi "... phương thức không xác định" line_to_remove? ' cho chính: Object ... "vì"? ". Bạn có thể cho tôi biết tại sao? – bugerrorbug

+0

Tôi xin lỗi, line_to_remove? được cho là một điều kiện cho các remotion, tôi sẽ cập nhật các câu trả lời cho phù hợp – Doodad

+0

Cảm ơn rất nhiều! Giải pháp của bạn thực sự đã giúp tôi! Cảm ơn một lần nữa! – bugerrorbug

-2
file.each do |line| 
    if should_be_deleted(line) 
    f.seek(-line.length, IO::SEEK_CUR) 
    f.write(' ' * (line.length - 1)) 
    f.write("\n") 
    end 
end 
file.close 

File.new(filename).each {|line| p line } 
+0

Tôi không hiểu giải pháp của bạn, bạn có thể giải thích nó không? – bugerrorbug

+0

bạn có thể cho tôi một ví dụ cập nhật tại chỗ không? – bugerrorbug

+1

của nó từ http://stackoverflow.com/a/16638778/170881 –