您的位置:首页 > 其它

txt 开关 csv 可通用 工具

2015-07-11 10:58 232 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: