CSV只返回字符串.我需要保留值类型



我试图解析一个CSV文件,抓取每一行并上传到Postgres。问题是CSV.foreach将每个值都作为字符串返回,而Postgres不接受双列中的字符串值。

有没有一种简单的方法可以保存值类型?还是我必须一列接一列地将字符串转换为双精度和日期格式?

require 'csv'
CSV.foreach("C:\test\file.csv") do |row|
    print row
end

我所需要的只是值保持其类型,而不是作为字符串返回。我不知道CSV是否可以做到这一点。当我使用电子表格gem来解析.xls文件时,它工作得很好。

CSV本身没有类型;CSV包含以逗号分隔的简单文本。当您查看CSV时,您将看到文件中的所有内容。在Excel文件中,有许多隐藏的元数据用于跟踪每个单元格的类型。

当您通过CSV #foreach时,每一行都作为字符串值的数组给出。一排可能看起来像

[ "2.33", "4", "Hello" ]

每个值作为字符串给出。您可能认为"2.33"是一个浮点/双精度,但CSV解析器只知道将其视为一个字符串。

您可以使用Ruby的类型转换函数将字符串转换为其他类型,假设每列只包含一个类型(由于您使用的是SQL数据库,这是一个非常安全的假设(。

您可以编写这样的内容,将每行中的值转换为特定类型。本例将第一行转换为浮点值(应使用Postgres的"double"(,将第二行转换为整数,将第三行转换为字符串。

require 'csv'
CSV.foreach("C:\test\file.csv") do |row|
    puts [ row[0].to_f, row[1].to_i, row[2].to_s ] 
end

给定上面的样本行,此函数将打印一个类似的数组

>> [ 2.33, 4, "Hello" ]

您应该能够在使用Postgres的任何其他操作中使用这些转换后的值。

require 'csv'
CSV.foreach("test.txt", converters: :all) do |row|
    print row
end

这应该转换数字和日期时间。对于整数和浮点,这非常有效,但我无法实际转换到DateTime。

最新更新