• 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
    




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

  • 相关阅读:
    Delphi映射模式实验
    restTemplate工具类
    RestTemplate中几种常见的请求方式
    RestTemplate(一)
    java.util.NoSuchElementException: No value present
    使用jsonRpc进行远程调用的时候com.googlecode.jsonrpc4j.HttpException: stream is closed
    SLF4J: Class path contains multiple SLF4J bindings.警告解决
    如何更改自己博客(博客园的)的背景
    Django中扩展Paginator实现分页
    bootstrap 导航栏
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4638203.html
Copyright © 2020-2023  润新知