Module: EasySheetIo
- Defined in:
- lib/easy_sheet_io.rb,
lib/easy_sheet_io/version.rb
Defined Under Namespace
Classes: Error
Constant Summary collapse
- VERSION =
"0.4.8.3"
Class Method Summary collapse
- .read(path, **opt) ⇒ Object
-
.read_csv(path, format: :daru, encoding: "utf-8", col_sep: ",", index: nil, **opt) ⇒ Object
##Generate Array from CSV File, and convert it to Hash or DataFrame.
-
.read_excel(path, sheet_i: 0, format: :daru, encoding: "utf-8", index: nil, **opt) ⇒ Object
##Generate Array from EXCEL File, and convert it to Hash or DataFrame.
- .recognize_type(str, expected) ⇒ Object
-
.to_df(d, format: :daru) ⇒ Object
Convert Hash to DataFrame.
-
.to_hash(array2d, line_from: 1, line_until: nil, line_ignored: nil, column_from: nil, column_until: nil, header: 0, symbol_header: false, replaced_by_nil: [], analyze_type: true, index: nil) ⇒ Object
Convert 2d Array to Hash header: nil -> Default Headers(:column1, column2,…) are generated.
Class Method Details
.read(path, **opt) ⇒ Object
16 17 18 |
# File 'lib/easy_sheet_io.rb', line 16 def read(path, **opt) return /csv$/ === path ? read_csv(path, **opt) : read_excel(path, **opt) end |
.read_csv(path, format: :daru, encoding: "utf-8", col_sep: ",", index: nil, **opt) ⇒ Object
##Generate Array from CSV File, and convert it to Hash or DataFrame. **opt candidate= line_from: 1, header: 0 ver. 0.3.8~ default format=:daru
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/easy_sheet_io.rb', line 23 def read_csv(path, format: :daru, encoding: "utf-8", col_sep: ",", index: nil, **opt) ## TODO.. index: option that designate column number to generate DF index. ## That is, revicing set_index method. # Get 2D Array begin csv = CSV.parse(File.open(path, encoding: encoding, &:read), col_sep: col_sep) rescue # Try Another Encoding ## puts "Fail Encoding #{encoding}. Trying cp932..." csv = CSV.parse(File.open(path, encoding: "cp932", &:read), col_sep: col_sep) encoding = "cp932" end if format.to_s == "array" return csv elsif format.to_s == "hash" h, i = to_hash(csv, **opt) return h else # include format.nil? (in this case, convert to Daru::DF). h, ind_orig = to_hash(csv, index: index, **opt) ans = to_df(h, format: format) # Converting Encode and Setting index.. rover not supported yet if format.to_s == "daru" || format.nil? ans.convert_enc!(from: encoding, to: "utf-8") ans.index = ind_orig if index end return ans end end |
.read_excel(path, sheet_i: 0, format: :daru, encoding: "utf-8", index: nil, **opt) ⇒ Object
##Generate Array from EXCEL File, and convert it to Hash or DataFrame. **opt candidate= line_from: 1, header: 0)
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/easy_sheet_io.rb', line 59 def read_excel(path, sheet_i: 0, format: :daru, encoding: "utf-8", index: nil, **opt) a2d = open_excel(path, sheet_i, encoding: encoding) # Get 2D Array if format.to_s == "array" return a2d elsif format.to_s == "hash" h, i = to_hash(a2d, **opt) return h else # include format.nil? h, ind_orig = to_hash(a2d, index: index, **opt) ans = to_df(h, format: format) if format.to_s == "daru" || format.nil? ans.index = ind_orig if index end return ans end end |
.recognize_type(str, expected) ⇒ Object
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
# File 'lib/easy_sheet_io.rb', line 204 def recognize_type(str, expected) return expected if str.nil? order = {:any => 0, :int => 1, :float => 2, :string => 3} if /^\s*(-|\+)?\d+\s*$/ === str type_of_str = :int elsif /^\s*(-|\+)?\d*\.\d*\s*$/ === str || /^\s*(-|\+)?(\d*\.\d+|\d+)(e|E)(-|\+)?\d+\s*$/ === str type_of_str = :float else type_of_str = :string end # p "#{type_of_str}, #{str}" if order[type_of_str] > order[expected] return order[type_of_str] > order[expected] ? type_of_str : expected end |
.to_df(d, format: :daru) ⇒ Object
Convert Hash to DataFrame
129 130 131 132 133 134 135 |
# File 'lib/easy_sheet_io.rb', line 129 def to_df(d, format: :daru) if format.to_s == "daru" || format.nil? Daru::DataFrame.new(d) else Rover::DataFrame.new(d) end end |
.to_hash(array2d, line_from: 1, line_until: nil, line_ignored: nil, column_from: nil, column_until: nil, header: 0, symbol_header: false, replaced_by_nil: [], analyze_type: true, index: nil) ⇒ Object
Convert 2d Array to Hash header: nil -> Default Headers(:column1, column2,…) are generated. Option line_ignored, is not implemented yet.
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/easy_sheet_io.rb', line 80 def to_hash(array2d, line_from: 1, line_until: nil, line_ignored: nil, column_from: nil, column_until: nil, header: 0, symbol_header: false, replaced_by_nil: [], analyze_type: true, index: nil) ## TODO.. column_from: , column_until: # Define Read Range------------ lfrom, luntil = line_from, line_until lf_reg, lu_reg = line_from.kind_of?(Regexp), line_until.kind_of?(Regexp) if lf_reg || lu_reg lines_ary = array2d.map{ _1.join "," } lfrom = lines_ary.find_index{ line_from === _1 } if lf_reg luntil = (lines_ary.length-1) - lines_ary.reverse.find_index{ line_until === _1 } if lu_reg end # And get originally array----- output = array2d[lfrom...luntil] # ----------------------------- # Then get data of index------- ind_orig = index ? output.map{ _1[index] } : nil # ----------------------------- # Selecct Column--------------- output = output.map { _1[column_from...column_until] } if column_from || column_until # Define Data Array------------ output_transpose = output[0].zip(*output[1..]) output_transpose = fix_array(output_transpose, replaced_by_nil, analyze_type) # ----------------------------- # Define Header---------------- if header hd = check_header(array2d[header])[column_from...column_until] else hd = [*0...(output.longest_line)].map{"column#{_1}"} end # hd = header.nil? ? [*0...(output.longest_line)].map{"column#{_1}"} : check_header(array2d[header]) hd = hd.map { _1.intern } if symbol_header # ----------------------------- # Make Hash(Header => Data Array) return hd.each_with_object({}).with_index {|(hdr, hash), i| hash[hdr]=output_transpose[i]}, ind_orig end |