这篇文章主要介绍了Ruby操作CSV格式数据方法,包括CSV格式文件读写,类型转换等操作,需要的朋友可以参考下
CSV格式的数据默认是以逗号分隔各个字段的一条一条记录,默认用换行符分隔每一条记录。此外,有的CSV有标题行,有的没有。还有其他一些格式, 它们都有默认值,但都可以在读、写CSV数据时修改默认设置。后文大多数时候故意忽略这些设置,因为绝大多数读写操作都使用同样的参数**options
进行格式设置。例如,在读取csv文件中的数据时想要忽略标题行,可以在参数中设置headers: true
可设置的项及其默认值包括:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
要向文件中写入CSV格式的数据:
1 2 3 4 5 6 7 8 |
|
写入完成后,查看:
1 2 3 4 |
|
注意其中的nil对应的写入内容为空。
可以直接在语句块中写入,这样的话可以自动关闭CSV.open()打开的IO流:
1 2 3 4 5 6 7 8 |
|
CSV.open()打开的是一个封装后的IO流对象,它除了可以使用CSV单独为其提供的一些方法(比如这里的<<
)外,还可以使用很多IO流对象的方法,比如seek()、tell()、flush()、eof?()、fsync()等等。
这里使用的<<
方法是单独为其提供的,它涉及两个执行过程:
如果只是想执行第一个过程,即将数据转换成CSV格式的字符串而不写入,可使用类方法generate_line()
:
1 2 3 4 5 6 7 8 9 10 |
|
如果想要读取CSV文件,可使用类方法read()或别名readlines():
1 2 3 4 5 6 7 |
|
注意:
如果要按行读取CSV文件的内容,使用类方法foreach():
1 2 3 4 5 6 7 8 9 |
|
如果想要从字符串中读取CSV格式的数据,使用parse()和parse_line(),分别用于解析多行字符串和解析单行字符串(超出一行的自动被忽略)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
CSV.new()
、CSV.open()
可以创建csv对象(即一行一行csv格式的数据)CSV.generate()
可将字符串转换成csv对象并将该对象传递给语句块<<
、puts()
或add_row()
可向CSV目标中(字符串格式的CSV或CSV IO流)写入行,它们是别名关系gets()
、shift()
、readline()
可从csv对象中读取一行数据read()
、readlines()
可以读取csv对象中的所有数据each()
可以从csv对象中迭代每一行eof()
或eof?()
可以判断是否读完所有数据rewind()
可以重置当前csv对象的偏移指针line()
可以获取最近一次读取的一行数据lineno()
可以获取当前已读取的行数path()
可以获取当前读取的csv文件名CSV.parse()、CSV.read()、CSV.table()等方法返回的都是数组的数组(二维数组),它们是CSV Table。
CSV table按照表的方式来处理csv数据,比如关注于行、关注于字段的一些操作可以采用csv table相关的方法来处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
读取CSV数据时,所有的数据都会转换为字符串格式。
1 2 3 |
|
可以在迭代每一行的语句块中对字段做必要的类型转换。
但如果类型转换方式比较简单,可以在读取数据时指定converters属性进行转换。该属性的值要么是CSV的内置类型符号,要么是符号数组,要么是一个lambda表达式。有如下内置类型:
1 2 3 4 5 6 |
|
当指定了类型转换后,每个字段将针对converters的值尝试做转换,转换失败则保留字段的值不变,所以如果通过lambda自定义类型转换时也一定要保证这一点。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
转自:微点阅读 https://www.weidianyuedu.com