Ruby Txt 开关 CSV 常用工具
to
require 'csv' namespace :sys_file_conver do desc "把txt数据导入到csv中" task :txt_to_csv => :environment do amount = 100 head_hash = { '对账文件名' =>[12], '商户号' =>[15], '商户类型' => [4], '清算日期' => [8], '总比数' => [12], '总金额' => [15, amount], '支付总比数' => [12], '支付总金额' => [15, amount], '退款总比数' => [12], '退款总金额' => [15, amount], '撤销总比数' => [12], '撤销总金额' => [15, amount] } body_hash = { '清算日期' => [8], '入账日期' => [8], '卡号' => [19], '交易类型' => [4], '交易金额' => [ 15, amount], '入账金额' => [ 15, amount], '手续费金额' => [ 15, amount], '流水号' => [6], '交易日期时间' => [10], '终端号' => [8], '商户号' => [15], '商户类型' => [4], '受理机构号' => [6], '系统检索号' => [12], '授权号' => [6], '渠道类型' => [2], '支付卡种' => [2], '订单号' => [40] } txt_file_path = ENV['txt_file_path'] || "#{Rails.root}/tmp/txt_file.txt" csv_file_path = ENV['csv_file_path'] || "#{Rails.root}/tmp/csv_file.csv" File.new(csv_file_path) if FileTest::exists?(csv_file_path) CSV.open(csv_file_path,'wb:gbk:gbk') do |data| # wb:gbk:gbk to gbk default encoding is utf-8 data << hash_to_array_value(head_hash) txt_array = IO.readlines(txt_file_path, :encoding => 'GB2312') txt_array.each_with_index do |str,index| case index when 0 data << str_to_array_by_hash(str,head_hash) data << hash_to_array_value(body_hash) else data << str_to_array_by_hash(str,body_hash) end end end end # ----------------------------Hash to array------------------------------------ def str_to_array_by_hash(str,hash) array = [] hash_to_array_value(hash, 1).inject(0){ |idx, code| str_code = str[idx,code[0]] str_code = str_code.to_f/code[1] unless code[1].blank? array << convert_gbk(str_code) idx+code[0] } array end # def hash_to_array_key(hash) # hash.inject([]){|a,d| a << convert_gbk(d[0])} # end def hash_to_array_value(hash,i=0) hash.inject([]){|a,d| a << convert_gbk(d[i])} end # ---------------------------Convert util-------------------------------------- def convert(str) require 'iconv' begin converter = Iconv.new("UTF-8", "GB2312") converter.iconv(str) rescue str end end def convert_gbk(str) require 'iconv' begin converter = Iconv.new("GB2312", "UTF-8") converter.iconv(str) rescue str end end end
Html form tag
.upload-body = form_tag upload_file_file_converts_url, :multipart => true do %p %span.label 上传文件 = file_field :public, :picture %p %input.button.ml20{ :type => 'submit', :value => '转码' }
controller upload to download
#iconv -f gbk csv_file.csv def upload_file uploaded_io = params[:public][:picture] file = File.join("public", uploaded_io.original_filename) FileUtils.cp uploaded_io.path, file send_file FileConvert.txt_convert_csv(file),:filename => "CSV-#{uploaded_io.original_filename} #{Time.now.strftime('%F %T')}.csv" end
版权声明:本文博客原创文章,博客,未经同意,不得转载。