簡體   English   中英

從紅寶石上的文件中刪除文本行

[英]Remove line of text from file on ruby

我有一個txt文件,每行都有一系列字符串。 我需要找到給定的字符串,將該字符串移動到另一個文件,然后從文件中刪除該行。

移動到另一個文件正在運行,這是代碼。

File.open('file_moved.txt', 'w') { |file| file.puts pick_random_line.to_i.to_s }

def pick_random_line
  chosen_line = nil
  File.foreach("file.txt").each_with_index do |line, number|
  chosen_line = line if rand < 1.0/(number+1)
  end
  chosen_line
end

我對如何從其他文件中刪除該行感到有點迷茫。 Ruby中用匹配字符串刪除整行的方法是什么?

這樣的事情怎么樣?

lines = File.readlines('file.txt')

random_line = lines.shuffle.pop

File.open('file.txt', 'w') do |f|
  f.write(lines.join(''))
end

File.open('random.txt', 'a') do |f|
  f.write(random_line)
end

請注意, readlines具有將整個文件讀入內存的效果,但這也意味着您可以從文件中獲得真正的隨機樣本。 您的實現可能更偏向於文件的末尾,因為您事先不知道有多少行。

與以這種方式進行操作的任何操作一樣,如果此程序意外停止,則文件可能會被截斷的可能性很小。 避免這種情況的常用方法是寫入一個臨時文件,然后在成功后重命名。 更好的選擇是使用數據庫,甚至是像SQLite這樣的嵌入式數據庫。

從文件中刪除任何字節或子字符串本質上意味着您必須至少從該點開始重寫該文件。 可能存在某些專業的文件系統,但事實並非如此,但是大多數通用文件系統不允許廉價地從文件中間刪除字節。 可能最接近“應用此更改:刪除這些行”控件的類型是git類的版本管理系統。

就您的問題而言,這實際上只是一種哲學-如果您的輸出必須是刪除了該行的另一個文本文件,那么您只需生成兩個文件:

  • 帶有提取數據的新文件

  • 已刪除數據的已更改原始文件(寫回原始文件的頂部)

有一些有關如何處理原始文件的選項:

  • 讀取所有數據,調整內存,並覆蓋原始數據。 這是最簡單的方法,但不能擴展到大文件。

  • 逐行讀取數據,立即將每一行寫入臨時更改的文件或新文件。 在該過程結束時,刪除原始舊文件,並將臨時更改的文件移動到其位置。 這有點復雜,但是可以處理更大的文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM