String#scan
返回Array
的Array
一個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#<<
預計Strings
的Array
,或東西可以轉化爲String
S作爲參數。您傳遞Array
的Array
一個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。