我们刚刚发现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。
答案 0 :(得分:0)
什么可能导致CSV导出中文本的cut = off?
puts File.read('your_cutoff_text.txt').size
--output:--
256
String:
Limited to 255 characters (depending on DBMS)
我的操作系统会自动在文件末尾添加换行符,因此截止文本只包含255个字符。
在同一个文件中,有比这更长的字段 没问题。
Text:
Unlimited length (depending on DBMS)