CSV到底做什么?(我知道这是一颗宝石(
什么是SLICE_SIZE?(13号线(
为什么csv内部是直括号?(第16行(CSV do|CSV|
你能解释一下第17、18、19行吗?我完全迷失了方向?
-----------------代码----------------------------------------------------
require 'twitter'
require 'csv'
def twitter_client
@twitter_client ||= Twitter::REST::Client.new do |config|
config.consumer_key = ""
config.consumer_secret = ""
config.access_token = ""
config.access_token_secret = ""
end
end
SLICE_SIZE = 100
def fetch_all_friends(twitter_username)
CSV do|csv|
twitter_client.follower_ids(twitter_username).each_slice
(SLICE_SIZE).with_index do |slice, i|
twitter_client.users(slice).each_with_index do |f, j|
csv << [i * SLICE_SIZE + j + 1, f.name,
f.screen_name]
end
end
end
end
CSV是一个类,实现CSV数据的处理,如下所示。
each_slice
是Enumerable
的一种方法,每次迭代只从源集合中获取这么多元素。这样做是为了减少计算的内存需求,或者,例如,可能是为了延迟获取更多数据,直到处理完当前块。SLICE_SIZE
值是要获取的元素数。
CSV do |csv|
初始化csv
对象并将其作为参数向下传递给块。这是一种组织代码的方式,例如初始化与块的业务逻辑是分开的。该块由do
和end
关键字分隔。
接下来的两行实际上是一个单独的语句:
twitter_client.follower_ids(twitter_username).each_slice(SLICE_SIZE).with_index do |slice, i|
它从Twitter API获取twitter_username
的追随者id的集合,从中获取SLICE_SIZE
块中的元素,并将每个块及其索引传递到另一个块中。该块的内容被执行的次数与CCD_ 11中的CCD_。
下一行
twitter_client.users(slice).each_with_index do |f, j|
仅适用于当前chunk的元素。它获取块中的每个元素,并将其与块中的索引一起传递给另一个块。
到目前为止,它更多的是收集处理,而不是实际的业务逻辑。
最内在的陈述
csv << [i * SLICE_SIZE + j + 1, f.name, f.screen_name]
创建一个由三个字段组成的数组:某种索引、Twitter提供的name
和screen_name
。此数组表示CSV行。<<
操作符将该数组推送到前面提到的csv
对象中。csv
对象将其添加到此时已收集的内容中。
当这个代码完成时,您将有一个csv
对象,其中包含从Twitterneneneba API接收的数据,并准备保存到磁盘。
过去有一个gem faster_csv
需要调用,但现在不再需要了。您只需要CSV库。
它通常用于读取或创建CSV文件。
当没有行号时,回答你的问题有点困难。您可以在以下位置了解有关Ruby CSV库的更多信息:http://ruby-doc.org/stdlib-2.2.2/libdoc/csv/rdoc/CSV.html