如何使用Ruby替换CSV中指定列的值?

时间:2015-09-07 08:57:34

标签: ruby-on-rails ruby excel matlab csv

我有一个CSV,第一列给出了工作日。但问题是我需要在MATLAB中使用CSV,它不允许使用字符串值。所以,我想将星期日转换为7,...,星期一,以CSV格式转换为1。

但我似乎无法在Ruby中找到一种方法。我无法手动打开excel,因为文件大小很大。具体来说,我在弄清楚如何访问和指向Ruby中我想要的特定列的语法时遇到了问题。例如,如果文件已经在MATLAB中加载,并且由于某种原因我仍然需要将工作日转换为数字,我会编写一个这样的简单代码:

for i=1:length(Columns(:,1))
    if Columns(i,1)=='sunday'
        Columns(i,1)=7
    elseif Columns(i,1)=='saturday'
        Columns(i,1)=6
    elseif Columns(i,1)=='friday'
        Columns(i,1)=5
    elseif Columns(i,1)=='thursday'
        Columns(i,1)=4
    elseif Columns(i,1)=='wednesday'
        Columns(i,1)=3
    elseif Columns(i,1)=='tuesday'
        Columns(i,1)=2
    elseif Columns(i,1)=='monday'
        Columns(i,1)=1
    end
end

所以,我在弄清楚这个陈述的Ruby等价物时遇到了问题:

for i=1:length(Columns(:,1))

感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:3)

Ruby中有两个很好的CSV库,我假设根据你所说的CSV文件没有标题(如果有的话,A substitution string must always specify the URL path使事情变得容易一些)。

那就是说,你想得到第一列:

SmarterCSV

不确定这是否正是您想要的,有很多方法可以在Ruby中使用CSV文件。

要保存CSV,您需要使用CSV.open打开一个新的(或相同的)CSV文件:

require 'csv'

your_csv = CSV.open("your_csv.csv")
# This is the line you wanted:
first_column = your_csv.map(&:first)

# Then to do the weekday conversion (with a Hash):
convert_weekdays = { "sunday" => 1, "monday" => 2, "tuesday" => 3, "wednesday" => 4, "thursday" => 5, "friday" => 6, "saturday" => 7 }

converted = first_column.map { |row| convert_weekdays[row] }

对不起,它有点不优雅,在Ruby中编写CSV并不总是最简单的事情!请注意,大括号your_csv = CSV.open("your_csv.csv") CSV.open("saved_csv.csv", "w") do |csv| your_csv.each { |row| csv << [convert_weekdays[row.first], *row[1...row.size]] } end {}相同,但通常在内部块只有一行时使用。

编辑:使用大文件时,此方法可能会快一些:

do end

这样,您可以将CSV作为二维数组加载,转置它,并且只对第一列进行操作。