2016-10-08 20 views
1

我使用正則表達式從html文件中獲取參數。Ruby - 使用正則表達式和csv類寫入文件時,文件中的額外標點符號

我測試了正則表達式,它似乎很好 - 似乎csv轉換是什麼導致的問題,但我不知道。

以下是我有:

mechanics_file= File.read(filename) 
mechanics= mechanics_file.scan(/(?<=70%">)(.*)(?=<\/td)/) 

id_file= File.read(filename) 
id=id_file.scan(/(?<="propertyids\[]" value=")(.*)(?=")/) 

puts id.zip(mechanics) 

CSV.open('csvfile.csv', 'w') do |csv| 
id.zip(mechanics) { |row| csv << row } 
end 

賣出期權輸出看起來是這樣的:

2073 
Acting 
2689 
Action/Movement Programming 

但CSV看起來像這樣的內容:

"[""2073""]","[""Acting""]" 
"[""2689""]","[""Action/Movement Programming""]" 

怎麼辦我擺脫了所有額外的引號和括號?我在寫入csv的過程中做錯了什麼?

這是我的第一個紅寶石項目,所以我將不勝感激一個孩子友好的解釋:)在此先感謝!

回答

0

String#scan返回ArrayArray一個s(粗體重點煤礦):

scan(pattern)array

這兩種形式通過STR迭代,匹配圖案(其可以是一個Regexp或一個String)。對於每個匹配,都會生成結果並將其添加到結果數組或傳遞給塊。如果模式不包含組,則每個單獨的結果由匹配的字符串$&組成。 如果模式包含組,每個單獨的結果本身就是一個數組,每個組包含一個條目

a = "cruel world" 
# […] 
a.scan(/(...)/)  #=> [["cru"], ["el "], ["wor"]] 

所以,id看起來是這樣的:

id == [['2073'], ['2689']] 

mechanics看起來是這樣的:

mechanics == [['Acting'], ['Action/Movement Programming']] 

id.zip(movements)則是這樣的:

id.zip(movements) == [[['2073'], ['Acting']], [['2689'], ['Action/Movement Programming']]] 

這意味着在你的循環中,每個row看起來是這樣的:

row == [['2073'], ['Acting']] 
row == [['2689'], ['Action/Movement Programming']] 

CSV#<<預計StringsArray,或東西可以轉化爲String S作爲參數。您傳遞ArrayArray一個s,它會高興地通過每一個元素調用Array#to_s轉換成的String給你的一個Array,並且看起來像這樣:

[['2073'], ['Acting']].map(&:to_s) == [ '["2073"]', '["Acting"]' ] 
[['2689'], ['Action/Movement Programming']].map(&:to_s) == [ '["2689"]', '["Action/Movement Programming"]' ] 

最後,"是字符串分隔符在CSV,並且需要加倍它逃脫,所以究竟是什麼被寫入到CSV文件是這樣的:

"[""2073""]", "[""Acting""]" 
"[""2689""]", "[""Action/Movement Programming""]" 

糾正這種最簡單的方法,將是flatten的的返回值210秒(也許還有編號轉換爲Integer S,假定他們,事實上,Integer S):

mechanics_file = File.read(filename) 
mechanics = mechanics_file.scan(/(?<=70%">)(.*)(?=<\/td)/).flatten 

id_file = File.read(filename) 
id = id_file.scan(/(?<="propertyids\[]" value=")(.*)(?=")/).flatten.map(&:to_i) 

CSV.open('csvfile.csv', 'w') do |csv| 
id.zip(mechanics) { |row| csv << row } 
end 

另一個建議是徹底放棄Regexp S和使用HTML解析器解析HTML。

相關問題