txt 开关 csv 可通用 工具


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




版权声明:本文博客原创文章,博客,未经同意,不得转载。

原文地址:https://www.cnblogs.com/zfyouxi/p/4638203.html