如何在写入Ruby中的文本文件之前格式化文本?

时间:2013-01-18 16:09:55

标签: ruby

我有一个从数据库中检索信息的脚本,我需要将结果写出来。在检索过程中,我会以简洁的格式提取我想要显示的列标题和数据。以下是我需要它的示例:

user_name             name                          num_logins   
email_1@yahoo.com     Beachwood                     2            
email_2@yahoo.com     Beachwood                     2             
email_3@yahoo.com     Beachwood                     2             
email_4@yahoo.com     Beachwood                     2             
email_55@yahoo.com    Community Internal Medicine   6             

我是创建特定格式的报告/文件的新手,因此非常感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

Hirb宝石可能是一个很好的起点。它通常与IRB或Rail的控制台使用相关联,但没有任何迹象表明我们不能将其用于其他用途。

通常它想要包装用ASCII边框创建的表:

+--------------------+-----------------------------+------------+
| user_name          | name                        | num_logins |
+--------------------+-----------------------------+------------+
| email_1@yahoo.com  | Beachwood                   | 2          |
| email_2@yahoo.com  | Beachwood                   | 2          |
| email_3@yahoo.com  | Beachwood                   | 2          |
| email_4@yahoo.com  | Beachwood                   | 2          |
| email_55@yahoo.com | Community Internal Medicine | 6          |
+--------------------+-----------------------------+------------+

但是,通过应用一点gsub lovin',我们可以按照您的要求打扮:

values = [
  [ 'user_name',          'name',      'num_logins'          ],
  [ 'email_1@yahoo.com',  'Beachwood', '2'                   ],
  [ 'email_2@yahoo.com',  'Beachwood', '2'                   ],
  [ 'email_3@yahoo.com',  'Beachwood', '2'                   ],
  [ 'email_4@yahoo.com',  'Beachwood', '2'                   ],
  [ 'email_55@yahoo.com', 'Community Internal Medicine', '6' ],
]
puts Hirb::Helpers::AutoTable.render(
  values,
  :headers => values.shift,
  :description => false
).gsub(/^[+-]+\n?/, '').gsub('|', ' ')

看起来像:

  user_name            name                          num_logins  
  email_1@yahoo.com    Beachwood                     2           
  email_2@yahoo.com    Beachwood                     2           
  email_3@yahoo.com    Beachwood                     2           
  email_4@yahoo.com    Beachwood                     2           
  email_55@yahoo.com   Community Internal Medicine   6           

您可能希望在将数组传递给Hirb之前弹出数组的标题行,或者从单独的数组中提供它。如果是,请更改:headers选项。

答案 1 :(得分:1)

您应该查找ruby printf方法,该方法与C函数的名称非常相似。它允许您为要打印的每个值指定字段宽度和对齐方式。

printf "%20d %20d\n", 334, 44

答案 2 :(得分:0)

根据您对表格的看法,您可以使用terminal-table这样的宝石。

Github上的README没有提到它,但是this pull request显示了如何禁用表的边框。

Terminal::Table::X = ""
Terminal::Table::Y = ""
Terminal::Table::I = ""

答案 3 :(得分:0)

您也可以尝试我的table_print gem - 它非常灵活,但几乎不需要设置/配置http://github.com/arches/table_print