2017-05-13 172 views
0

我的要求是檢查給定的字符串(從文本文件中讀取它)是否存在於特定文件夾中的任何文件中,如果存在並打印匹配字符串的第一個字。在Ruby中打印匹配的字符串的第一個字

下面的代碼片段,

....... 
....... 
    my_files.each do |file_name| 
     puts "File Name: #{file_name}" 
     content = File.read(file_name) 
     changed = content.gsub(/#{Regexp.escape(id_value)}/, '') #'id_value' is from the first level loop ,stores string value(for every iteration). 

     if content.include?("#{id_value}") 
      print "its there\n" 
      Row = content.split.first 
      puts "From: #{Row}" 
     end 

其中的一個文件中的文件夾

CDA created on September 20th 1999 
Owner: Edward Jenner 
Access IDs, 
id = class\234ha, class\poi23, class\opiuj, cap\7y6t5 
dept = sub\6985de, ret\oiu87, class\234ha 

說,如果ID_VALUE是類\234公頃

對於第一次迭代,它應該輸出爲'id'和'dept',但輸出爲'CDA'。我也面臨下面的警告。

test.rb:19:警告:已初始化恆行test.rb:19: 警告:行以前的定義在這裏來源:類\ poi23

任何建議,請。我也尋找其他的選擇,但都沒有奏效。開始紅寶石如此友善地原諒我的無知。謝謝。

回答

0

下面是一個腳本,我有這樣的例子確實你在找什麼對於。如果你使用文件對象的each_line方法,這是非常困難的。

#!/usr/bin/env ruby 
regex_to_find = Regexp.new Regexp.escape(ARGV[0]) 
files = Dir.glob ARGV[1] 
files.each do |f| 
    current_file = File.new f 
    current_file.each_line do |l| 
    if l =~ regex_to_find 
     puts "#{f} #{current_file.lineno}: first word = #{l.split.first}, full line: #{l}" 
    end 
    end 
end 

如果您在包含您上面顯示的數據的文件的目錄上運行此腳本。你會得到以下輸出。我認爲你在尋找什麼。

$ ./q43950329.rb 'class\234ha' "*" 
q43950329_data 4: first word = id, full line: id = class\234ha, class\poi23, class\opiuj, cap\7y6t5 
q43950329_data 5: first word = dept, full line: dept = sub\6985de, ret\oiu87, class\234ha 

注意上面的輸出是一個名爲q43950329.rb和下列文件中被稱爲q43950329_data

CDA created on September 20th 1999 
Owner: Edward Jenner 
Access IDs, 
id = class\234ha, class\poi23, class\opiuj, cap\7y6t5 
dept = sub\6985de, ret\oiu87, class\234ha 
0

如果有這樣的事:

File.open( 'SAMPLE.TXT')的grep(/類\234公頃/){|線| line.split.first} => [「ID」,「部門」]

做一個塊傳遞給grep的方法

+0

我想,當前目錄存在,但我想捕捉陣列中的輸出或變量,然後將其寫入一個文件。感謝您的建議:) – dev

相關問題