Programming Tutorials

(追記) (追記ここまで)

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

JavaScript must be enabled for certain features to work
* Required information
1000

Comments

No comments yet. Be the first!
(追記) (追記ここまで)
(追記) (追記ここまで)

AltStyle によって変換されたページ (->オリジナル) /