Export/import Datas To/from a Csv File

Martin91發表於2019-02-16

今天需要給客戶的網站做支援產品資料匯出並且更新的功能,所以就涉及到了資料的匯入匯出了。在經過一番對比之下,果斷使用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

相關文章