Open and manipulate CSV files in Ruby
By: Vijay in Ruby Tutorials on 2009-03-03
1. To Open a CSV formatted file for reading or writing use
open(path, mode, fs = nil, rs = nil, &block)
For reading.
EXAMPLE 1
CSV.open('csvfile.csv', 'r') do |row| p row end
EXAMPLE 2
reader = CSV.open('csvfile.csv', 'r') row1 = reader.shift row2 = reader.shift if row2.empty? p 'row2 not find.' end reader.close
ARGS
filename: filename to parse. col_sep: Column separator. ?, by default. If you want to separate fields with semicolon, give ?; here. row_sep: Row separator. nil by default. nil means "\r\n or \n". If you want to separate records with \r, give ?\r here.
RETURNS
reader instance. To get parse result, see CSV::Reader#each.
For writing.
EXAMPLE 1
CSV.open('csvfile.csv', 'w') do |writer| writer << ['r1c1', 'r1c2'] writer << ['r2c1', 'r2c2'] writer << [nil, nil] end
EXAMPLE 2
writer = CSV.open('csvfile.csv', 'w') writer << ['r1c1', 'r1c2'] << ['r2c1', 'r2c2'] << [nil, nil] writer.close
ARGS
filename: filename to generate. col_sep: Column separator. ?, by default. If you want to separate fields with semicolon, give ?; here. row_sep: Row separator. nil by default. nil means "\r\n or \n". If you want to separate records with \r, give ?\r here.
RETURNS
writer instance. See CSV::Writer#<< and CSV::Writer#add_row to know how to generate CSV string.
2. Convert a line from cells data to string. Consider using CSV.generate_line instead. To generate multi-row CSV string, see EXAMPLE below.
generate_row(src, cells, out_dev, fs = nil, rs = nil)
EXAMPLE
row1 = ['a', 'b'] row2 = ['c', 'd'] row3 = ['e', 'f'] src = [row1, row2, row3] buf = '' src.each do |row| parsed_cells = CSV.generate_row(row, 2, buf) puts "Created #{ parsed_cells } cells." end p buf
ARGS
src: an Array of String to be converted to CSV string. Must respond to 'size' and '[](idx)'. src[idx] must return String. cells: num of cells in a line. out_dev: buffer for generated CSV string. Must respond to '<<(string)'. col_sep: Column separator. ?, by default. If you want to separate fields with semicolon, give ?; here. row_sep: Row separator. nil by default. nil means "\r\n or \n". If you want to separate records with \r, give ?\r here.
RETURNS
parsed_cells: num of converted cells.
3. parse(str_or_readable, fs = nil, rs = nil) {|row| ...} Parse lines from given string or stream. Return rows as an Array of Arrays.
# File csv.rb, line 115 def CSV.parse(str_or_readable, fs = nil, rs = nil, &block) if File.exist?(str_or_readable) STDERR.puts("CSV.parse(filename) is deprecated." + " Use CSV.open(filename, 'r') instead.") return open_reader(str_or_readable, 'r', fs, rs, &block) end if block CSV::Reader.parse(str_or_readable, fs, rs) do |row| yield(row) end nil else CSV::Reader.create(str_or_readable, fs, rs).collect { |row| row } end end
4. parse_line(src, fs = nil, rs = nil) Parse a line from given string. Bear in mind it parses ONE LINE. Rest of the string is ignored for example "a,b\r\nc,d" => ['a", 'b"] and the second line 'c,d" is ignored.
If you don't know whether a target string to parse is exactly 1 line or not, use CSV.parse_row instead of this method.
# File csv.rb, line 137 def CSV.parse_line(src, fs = nil, rs = nil) fs ||= ',' if fs.is_a?(Fixnum) fs = fs.chr end if !rs.nil? and rs.is_a?(Fixnum) rs = rs.chr end idx = 0 res_type = :DT_COLSEP row = [] begin while res_type == :DT_COLSEP res_type, idx, cell = parse_body(src, idx, fs, rs) row << cell end rescue IllegalFormatError return [] end row end
5. parse_row(src, idx, out_dev, fs = nil, rs = nil) Parse a line from string. Consider using CSV.parse_line instead. To parse lines in CSV string, see EXAMPLE below.
EXAMPLE
src = "a,b\r\nc,d\r\ne,f" idx = 0 begin parsed = [] parsed_cells, idx = CSV.parse_row(src, idx, parsed) puts "Parsed #{ parsed_cells } cells." p parsed end while parsed_cells > 0
ARGS
src: a CSV data to be parsed. Must respond '[](idx)'. src[](idx) must return a char. (Not a string such as 'a', but 97). src[](idx_out_of_bounds) must return nil. A String satisfies this requirement. idx: index of parsing location of 'src'. 0 origin. out_dev: buffer for parsed cells. Must respond '<<(aString)'. col_sep: Column separator. ?, by default. If you want to separate fields with semicolon, give ?; here. row_sep: Row separator. nil by default. nil means "\r\n or \n". If you want to separate records with \r, give ?\r here.
RETURNS
parsed_cells: num of parsed cells. idx: index of next parsing location of 'src'.
Add Comment
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
- Your name, rating, website address, town, country, state and comment will be publicly displayed if entered.
- Aside from the data entered into these form fields, other stored data about your comment will include:
- Your IP address (not displayed)
- The time/date of your submission (displayed)
- Your email address will not be shared. It is collected for only two reasons:
- Administrative purposes, should a need to contact you arise.
- To inform you of new comments, should you subscribe to receive notifications.
- A cookie may be set on your computer. This is used to remember your inputs. It will expire by itself.
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
- Although the administrator will attempt to moderate comments, it is impossible for every comment to have been moderated at any given time.
- You acknowledge that all comments express the views and opinions of the original author and not those of the administrator.
- You agree not to post any material which is knowingly false, obscene, hateful, threatening, harassing or invasive of a person's privacy.
- The administrator has the right to edit, move or remove any comment for any reason and without notice.
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comments