我正在尝试解析 CSV 文件并抓取每一行并将其上传到 Postgres。问题是 CSV.foreach
将每个值作为字符串返回,而 Postgres 不接受双列中的字符串值。
有没有一种简单的方法来保留值类型?或者我是否必须逐列将字符串转换为 double 和日期格式?
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”视为 float / double ,但 CSV 解析器只知道将其视为字符串。
您可以使用 Ruby 的类型转换函数将字符串转换为其他类型,假设每一列只包含一种类型(因为您使用的是 SQL 数据库,这是一个非常安全的假设)。
您可以编写类似这样的代码,将每行中的值转换为特定类型。此示例将第一行转换为 float (应该与 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 进行的任何其他操作中使用这些转换后的值。
关于ruby - CSV 仅返回字符串。我需要保留值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30538152/