今天需要给客户的网站做支持产品数据导出并且更新的功能,所以就涉及到了数据的导入导出了。在经过一番对比之下,果断使用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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。