首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在Ruby中使用hirb命名字段

无法在Ruby中使用hirb命名字段
EN

Stack Overflow用户
提问于 2018-01-29 00:23:52
回答 1查看 71关注 0票数 0

我知道我的问题很简单,但是我在网上找不到答案。

我有一个名为sorted_frequency的散列。我想使用gem hirb将其输出为表。当时,我只能在默认字段名(0,1)下打印散列。所以看起来是这样的:

代码语言:javascript
复制
0      1

wordA  ntimes
wordB  mtimes
wordC  rtimes

我想要重命名字段名称,使其如下所示:

代码语言:javascript
复制
words  number of times

wordA  ntimes
wordB  mtimes
wordC  rtimes

我的实际代码是:

代码语言:javascript
复制
#needs to install 'docx' and 'hirb' gems

require 'docx'
require 'hirb'
doc = Docx::Document.open('monografia.docx')
text_listed = doc.to_s.downcase.split(" ")
forbidden_list = ["o", "si", "em", "ha", "no", "és", "amb", "i", "/","el", 
"la", "els","les", "l'", "lo", "los", "en", "n'", "na", "es", "ets", "s'", 
"sa", "so", "ses", "sos", "un", "una", "unes", "uns", "a", "que", "s'", 
"al", "de","del", "per", "ens", "als", "com"]

clean_text= text_listed - forbidden_list

frequency = Hash.new 0

clean_text.each { |word| frequency[word] += 1 }

sorted_frequency = Hash[frequency.sort_by{ | word, times | -times }[0..20]]

puts Hirb::Helpers::AutoTable.render(sorted_frequency)

再次抱歉,如果这是个新手问题

编辑:

由于我的所有代码都已被询问过,我将对其进行解释。它在一个叫做“docx”的gem的帮助下打开一个docx文档。之后,它按空格拆分文档并创建一个数组。在那之后,我删除了一些我不想统计的单词(那些包含在forbidden_list中的单词)。然后创建一个散列,其中键是单词,值是该单词在docx中出现的次数。之后,我使用gem 'hirb对散列和输出进行排序。问题是我不知道如何命名创建的表的字段。我希望有人能帮助我。

EN

回答 1

Stack Overflow用户

发布于 2018-01-29 00:37:23

根据hirb docsAutoTable.render()接受的参数可以是array_of_arrays或array_of_hashes。但是因为您的散列参数有效,所以我查看了您的表输出,并决定尝试仅添加一个选项来更改您获得的列名:

代码语言:javascript
复制
require 'hirb'

freqs = {
  'go' => 3,
  'no' => 4,
  'to' => 1
}

puts Hirb::Helpers::AutoTable.render(
  freqs,
  fields: [1, 0],  #Specify which fields to include in the table and their order. 
                   #For a row that is an array, the field names are the integers 0, 1, 2, etc.
                   #For a row that is a hash, the field names are the keys.
  headers: {0 => 'Word', 1 => 'Frequency'},  #Convert the field names to something more desirable for the column headers
  description: false #Get rid of "3 rows in set" following the table
)


--output:--
+-----------+------+
| Frequency | Word |
+-----------+------+
| 3         | go   |
| 4         | no   |
| 1         | to   |
+-----------+------+

啊,真灵。必须发生的情况是:AutoTable.render()需要一个数组-- array_of_arrays或array _of_hashes-如果该方法没有将数组作为参数,它将在参数上调用to_a()。看看你的散列发生了什么:

代码语言:javascript
复制
~/ruby_programs$ irb
2.4.0 :001 > freqs = {'go' => 3, 'no' => 4, 'to' => 1}
 => {"go"=>3, "no"=>4, "to"=>1} 

2.4.0 :002 > freqs.to_a
 => [["go", 3], ["no", 4], ["to", 1]] 

这就是AutoTable.render()需要的array_of_arrays。稍微重新排列一下,array_of_arrays看起来像这样:

代码语言:javascript
复制
index 0  index 1
     |    |
[    V    V
   ["go", 3],  #row array
   ["no", 4], 
   ["to", 1]
] 

对于array_of_arrays,表中的列标题是每个行数组中的索引位置。AutoTable.render()的选项允许您指定要包括在表中的列/索引位置以及它们的顺序,并且这些选项允许您将列标题转换为更理想的内容。

下面是一个更一般的例子:

代码语言:javascript
复制
require 'hirb'
require 'pp'

data = [
  ['go', 1, '1/12/18'],
  ['to', 4, '1/24/18'],
  ['at', 2, '1/28/18']
]

puts Hirb::Helpers::AutoTable.render(
  data,
  fields: [2, 0],  #Specify the index positions in each row array to include in the table and their column order in the table
  headers: {0 => 'Word', 2 => 'Date'},  #Convert the column headers to something more desirable
  description: false #Get rid of "3 rows in set" following the table
)

--output:--
+---------+------+
| Date    | Word |
+---------+------+
| 1/12/18 | go   |
| 1/24/18 | to   |
| 1/28/18 | at   |
+---------+------+

====

代码语言:javascript
复制
require 'hirb'
require 'pp'

freqs = {
  'go' => 3,
  'no' => 4,
  'to' => 1
}

col_names = %w[word count]

new_freqs = freqs.map do |key, val| 
  {col_names[0] => key, col_names[1] => val}
end

pp new_freqs

puts Hirb::Helpers::AutoTable.render(
  new_freqs, 
  fields: ['word', 'count'],  #Specify which keys to include in table and their column order.
  headers: {'word' => 'Good Word', 'count' => 'Frequency'},  #Convert keys to more desirable headers.
  description: false #Get rid of "3 rows in set" following the table
)

--output:--
[{"word"=>"go", "count"=>3},
 {"word"=>"no", "count"=>4},
 {"word"=>"to", "count"=>1}]
+-----------+-----------+
| Good Word | Frequency |
+-----------+-----------+
| go        | 3         |
| no        | 4         |
| to        | 1         |
+-----------+-----------+

====

代码语言:javascript
复制
require 'hirb'
require 'pp'

freqs = {
  'go' => 3,
  'no' => 4,
  'to' => 1
}

col_names = %i[word count]

new_freqs = freqs.map do |key, val| 
  {col_names[0] => key, col_names[1] => val}
end

pp new_freqs
puts Hirb::Helpers::AutoTable.render(new_freqs)

--output:--
[{:word=>"go", :count=>3}, {:word=>"no", :count=>4}, {:word=>"to", :count=>1}]
+-------+------+
| count | word |
+-------+------+
| 3     | go   |
| 4     | no   |
| 1     | to   |
+-------+------+
3 rows in set

===

代码语言:javascript
复制
require 'hirb'
require 'pp'

data = {
  'first' => 'second', 
  'third' => 'fourth', 
  'fifth' => 'sixth'
}

col_names = %i[field1 field2]

new_data = data.map do |key, val| 
  {col_names[0] => key, col_names[1] => val}
end

pp new_data
puts Hirb::Helpers::AutoTable.render(new_data)

--output:--
[{:field1=>"first", :field2=>"second"},
 {:field1=>"third", :field2=>"fourth"},
 {:field1=>"fifth", :field2=>"sixth"}]
+--------+--------+
| field1 | field2 |
+--------+--------+
| first  | second |
| third  | fourth |
| fifth  | sixth  |
+--------+--------+
3 rows in set

=====

代码语言:javascript
复制
require 'hirb'

data = [
  {field1: 'first', field2: 'second'},
  {field1: 'third', field2: 'fourth'},
  {field1: 'fifth', field2: 'sixth'}
]

puts Hirb::Helpers::AutoTable.render(data)

--output:--
+--------+--------+
| field1 | field2 |
+--------+--------+
| first  | second |
| third  | fourth |
| fifth  | sixth  |
+--------+--------+
3 rows in set
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48488521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档