2013-01-18 99 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選項。

相關問題