什么原因导致CSV导出切断了Ruby 2.0.0 / Postgres 9.3 / Rails 4.2中的文本

时间:2015-10-24 04:01:11

标签: ruby-on-rails ruby postgresql csv

我们刚刚发现CSV导出会在一个字段中切断文本。以下是CSV导出的原始文本(来自postgres 9.3的文本字段):

@payable_approved_unpaid, @payable_paid, @payable_po_unpaid = {}, {}, {}
models.each do |m|
     @payable_po_unpaid[m.id.to_s] = PurchaseOrderx::Order.where(project_id: m.id).sum('po_total') - PaymentRequestx::PaymentRequest.where(project_id: m.id).where(resource_string: 'purchase_orderx/orders').sum('amount')
     @payable_paid[m.id.to_s] = PaymentRequestx::PaymentRequest.where(project_id: m.id).where(wf_state: :paid).sum('amount')
     @payable_approved_unpaid[m.id.to_s] = PaymentRequestx::PaymentRequest.where(project_id: m.id).where('approved = ? AND wf_state != ?', true, :paid).sum('amount')
end

以下是我们从CSV中获得的信息:

@payable_approved_unpaid, @payable_paid, @payable_po_unpaid = {}, {}, {}

models.each do |m|

     @payable_po_unpaid[m.id.to_s] = PurchaseOrderx::Order.where(project_id: m.id).sum('po_total') - PaymentRequestx::PaymentRequest.where(project_id: m.id).wher

在同一个文件中,有比这更长的字段,没有问题。我们一直在使用导出这是我们第一次丢失文本。什么可能导致CSV导出中文本的cut = off?

以下是CSV导出的方法,argument_value是带有截断文本的字段。在调试中,我们验证了在导出之前已将列的完整上下文分配给CSV:

def self.to_csv
      CSV.generate do |csv|
        header = ['id', 'engine_name', 'engine_version', 'argument_name', 'argument_value', 'last_updated_by_id', 'created_at', 'updated_at', 'brief_note', 'global']        
        csv << header
        i = 1
        all.each do |config|
          base = OnboardDatax.engine_config_class.find_by_id(config.engine_config_id)
          row = Array.new
          row << i
          row << (base.global ? nil : base.engine.name)
          row << base.engine_version
          row << base.argument_name
          row << (config.custom_argument_value.present? ? config.custom_argument_value : base.argument_value)
          row << config.last_updated_by_id
          row << config.created_at
          row << config.updated_at
          row << base.brief_note
          row << (base.global ? 't' : 'f')
          csv << row
          i += 1
        end
      end

如果用引号包装整个文本,那么该列可以完整地导出为CSV。

1 个答案:

答案 0 :(得分:0)

  

什么可能导致CSV导出中文本的cut = off?

puts File.read('your_cutoff_text.txt').size

--output:--
256 

Rails column types

String:
Limited to 255 characters (depending on DBMS)

我的操作系统会自动在文件末尾添加换行符,因此截止文本只包含255个字符。

  

在同一个文件中,有比这更长的字段   没问题。

Rails column types

Text: 
Unlimited length (depending on DBMS)