2013-06-19 19 views
1

我有一堆包含文本和數字的行的文件。每個文件中的文本保持不變,但數字會改變。 (這是正在運行的數據,所以行就像「 - 活動持續時間28:19, - 總距離3.66mi。」等等)在Ruby中查找數值,然後將它們轉換爲字符串

我想要做的是在這些行中找到單個數字,然後創建我自己的輸出,例如:「#{time}中的Ran#{距離}」

我可以使用正則表達式在行中找到這些數字,但我無法弄清楚如何取這些值並把它們變成他們自己的字符串。我甚至不確定正則表達式是否正確。我一直在運行這樣的事情:

if line =~/\d*\.\d*/ 
found completed = true 

但是我不確定接下來會發生什麼。

我希望我是清楚的,並且在此先感謝您的幫助。

+0

的距離,你可以發佈一個例子字符串? –

回答

2

您可以在元素引用中使用正則表達式來獲取數字數據。例如:

2.0.0-p0 :010 > distance = line[/\d*\.\d*/] 
=> "3.66" 
2.0.0-p0 :011 > time = line[/\d*:\d*/] 
=> "28:19" 
2.0.0-p0 :012 > puts "Ran #{distance} in #{time}" 
Ran 3.66 in 28:19 
=> nil 
+0

看起來很有希望。它需要什麼嗎?現在我得到'未定義的局部變量或方法'線'爲主:對象(NameError)' – craigeley

+0

明白了。優雅而有效。謝謝! – craigeley

+2

在掃描唯一出現的模式時,我更希望'line [/ \ d + \。。d * /]','line [/ \ d +:\ d + /]'。 –

1

你可以這樣做:

rawlines = <<EOF 
- Active Duration 28:19, - Total distance 3.66mi. 
- Active Duration 25:12, - Total distance 3.66mi. 
- Active Duration 24:10, - Total distance 3.66mi. 
- Active Duration 28:21, - Total distance 3.66mi. 
- Active Duration 27:19, - Total distance 3.66mi. 
EOF 

rawlines.scan(/Active Duration (\d++:\d++), - Total distance (\d++(?>\.\d++)?)/) do |dur, dist| 
    puts "Ran #{dist} in #{dur}\n" 
end 
1

更新的答案,以顯示遍歷所有文件。

我把結果放到一個散列中,這樣可以使用鍵值對來處理數據。新的密鑰可以添加爲計量單位等

runData_20130620.txt
- 活動時間09.87,距離 - 總100.0米
- 活動時間15:19,距離 - 總4.98公里
- 主動持續時間03:00,距離 - 總1.0英里
- 活動時間21:14,距離 - 總3.68,-Sweat生產5.99Gallons
- 活動時間22:31,距離 - 總3.65mi

代碼

File.foreach("runData_20130620.txt") do |line| 

    # Create hash, parsing string with regex pattern 
    runData = Hash[*line.scan(/([^, \-]\D*) (\d*[.:]\d*)/).to_a.flatten] 

    # This will convert the string keys to symbols, replacing white-space with 
    # underscores and downcasing 

    runData = Hash[runData.map { |k,v| 
         [k.gsub(/\s+/, "_").downcase.to_sym, v] }] 

    # display results 
    #runData.each { |k,v| puts "#{k} ** #{v}" } 

    # display using hash symbol access... 
    puts "\nRan a distance of #{ runData[:total_distance]} in 
               runData[:active_duration]} " 
    puts "Man, I am unfit!" if runData[:sweat_produced] 
end 

結果

然的100.0的距離在09.87

在15點19

然的4.98的距離在03:00然1.0的距離

然的3.68的距離在21:14
男人,我不適合!

冉3.65 22:31

+0

你將需要修改正則表達式模式 - 我首先整理數據 – Stephen

+0

有趣,看起來不錯!但是,我怎麼能把它設置爲一個腳本來讀取文件中的行?例如,「myData」總是在變化,我不想手動輸入。 – craigeley

+0

這不應該太難使用常規的構造。您的文件是否具有指定的格式,即文件中的每一行都是相同的結構? @craigeley – Stephen

相關問題