2013-01-18 57 views
0

我有一个从数据库中检索信息的脚本,我需要写出要存档的结果。在检索过程中,我拉列表头和数据,我喜欢以一个整齐的格式显示。这里是什么,我需要它看起来像一个例子:如何在写入Ruby中的文本文件之前格式化文本?

user_name    name       num_logins 
[email protected]  Beachwood      2    
[email protected]  Beachwood      2    
[email protected]  Beachwood      2    
[email protected]  Beachwood      2    
[email protected] Community Internal Medicine 6    

我在创建以特定格式的报表/文件,所以任何帮助,将不胜感激新。

+0

您是否正在寻找的输出是固定的宽度或只是界定是否正确?输出的用例是什么? –

+0

是的。我正在寻找它是固定的。 – Joe

回答

1

你应该看看了红宝石printf方法,它是由同一个名字非常相似的C函数。它可以让你指定你正在打印的每个值的字段宽度和对齐方式。

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

['String#%'](http://www.ruby-doc.org/core-1.9.3/String.html#method-i-25)是我进行格式化的首选方式,因为它更通用用于完成相同事情的专用方式。 –

+0

是的,'String#%'也很棒。 –

0

根据您希望如何看上你的表是,你也许可以使用宝石如terminal-table这一点。

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

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

马克,我喜欢terminal-table,但我很努力地用数据库查询返回的数据动态创建它。每个查询返回将有不同数量的列返回。我怎样才能做到这一点?数组与数组 – Joe

+0

@Jfleck [Tin Man's answer](http://stackoverflow.com/a/14404234/126042)有嵌套数组的基本演示。如果你需要更具体的帮助,你应该开始一个新的问题。 –

2

Hirb宝石可以为你一个很好的起点。它通常与IRB或Rail的控制台使用有关,但没有任何说我们不能将其用于其他用途。

通常情况下它要包与ASCII边界创建的表:

 
+--------------------+-----------------------------+------------+ 
| user_name   | name      | num_logins | 
+--------------------+-----------------------------+------------+ 
| [email protected] | Beachwood     | 2   | 
| [email protected] | Beachwood     | 2   | 
| [email protected] | Beachwood     | 2   | 
| [email protected] | Beachwood     | 2   | 
| [email protected] | Community Internal Medicine | 6   | 
+--------------------+-----------------------------+------------+ 

但是,通过施加位gsub心爱的,我们可以穿着它像你想:

values = [ 
    [ 'user_name',   'name',  'num_logins'   ], 
    [ '[email protected]', 'Beachwood', '2'     ], 
    [ '[email protected]', 'Beachwood', '2'     ], 
    [ '[email protected]', 'Beachwood', '2'     ], 
    [ '[email protected]', 'Beachwood', '2'     ], 
    [ '[email protected]', 'Community Internal Medicine', '6' ], 
] 
puts Hirb::Helpers::AutoTable.render(
    values, 
    :headers => values.shift, 
    :description => false 
).gsub(/^[+-]+\n?/, '').gsub('|', ' ') 

哪看起来像:

 
    user_name   name       num_logins 
    [email protected] Beachwood      2   
    [email protected] Beachwood      2   
    [email protected] Beachwood      2   
    [email protected] Beachwood      2   
    [email protected] Community Internal Medicine 6   

你可能想在pa之前弹出数组的标题行将它传给Hirb,或者从单独的阵列中提供。如果是,则更改:headers选项。

相关问题