今天需要給客戶的網站做支援產品資料匯出並且更新的功能,所以就涉及到了資料的匯入匯出了。在經過一番對比之下,果斷使用csv
格式檔案作為資料匯入匯出的載體。
匯出csv檔案
與csv檔案主要相關的類是CSV
,此類在ruby的標準庫中被定義,所以只要在程式碼開頭引入相關檔案即可:
require `csv`
接著需要建立csv檔案,並在其中寫入資料:
CSV.open "path/to/csv/file", "wb", :col_sep => `|` do |csv|
csv << ["one", "row", "of", "contents"]
end
** 這裡有幾個細節值得一提:
1. open
方法是用於對CSV檔案進行寫操作的主要介面,對CSV檔案進行寫操作都應該使用此方法;
2. <<
操作符支援將字串陣列**寫入到csv檔案,一個陣列為一行,陣列中的一個字串為一個單元(field);
3. open
方法的第三個引數是一個雜湊,用於為開啟的檔案指定初始化賦值,具體可用的option以及其值可參考new
方法的說明:http://www.ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html#method-c-new
4. :col_sep
用於指定檔案中每一行中的每個單元之間的分隔符,當通過字串陣列想檔案中新增新行的時候,CSV將會在陣列元素也就是每一行的單元之間插入指定的分隔符,分隔符需要儘量避開已經在待匯出資料中存在的字元,以免後續匯入的時候發生歧義。
匯入csv檔案
匯入csv除了需要用到相關的類CSV
,還可能用到的類是CSV::Row
,前者提供開啟檔案以及將檔案按行分隔的方法foreach
,foreach將分隔後的行逐行分配到CSV::Row的例項中,通過呼叫CSV::Row的例項方法field
可對每個單元進行讀取。
假設我有這樣一個csv檔案:
id | value
1234 | hello
2345 | world
則相關的程式碼如下:
CSV.foreach(`path/to/file`), :col_sep => `|`, :headers => :first_row do |row|
# use datas of each row
id = row.field `id`
value = row.field `value`
end
** 同樣這裡也有幾個細節需要注意:**
1. foreach
是CSV類中用於讀取檔案的標準方法;
2. 通過指定:col_sep => `|`
可使CSV按照指定的分隔符分隔好檔案內容,方便後面field
方法的呼叫;
3. 指定:headers => :first_row
可使CSV將第一行視為檔案的headers,並且結合:col_sep
的設定可以將headers進行分割,這兩個是field
方法的基礎。
Related links:
http://www.ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html
http://www.ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV/Row.html