ruby - CSV 仅返回字符串。我需要保留值类型

标签 ruby csv spreadsheet object-type

我正在尝试解析 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/

相关文章:

ruby-on-rails - Rails,按相关模型计数排序

ruby - 如何使用 WMI 发现正在运行的批处理 (.bat) 文件名?

ruby-on-rails - 为什么 variable = true AND false 在 Rails 模型中导致值为 true 但在控制台中却没有

ruby - XML解析元素和元素属性到数组中

Python:pandas,解析数学运算

java - 使用 SuperCSV 一次性验证每个字段

python - 如何从多个 .csv 文件中的命名列中选择唯一值?

google-apps-script - 如何根据 Google Docs 电子表格中的当前日期设置行的背景颜色?

Ruby:读取 xls 文件的内容并获取每个单元格信息

excel - MS Excel 投资回收期公式显示年份/比较单独行中的累计总额