Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用Ruby替换CSV中指定列的值?_Ruby On Rails_Ruby_Excel_Matlab_Csv - Fatal编程技术网

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

Ruby on rails 如何使用Ruby替换CSV中指定列的值?,ruby-on-rails,ruby,excel,matlab,csv,Ruby On Rails,Ruby,Excel,Matlab,Csv,我有一个CSV,第一列给出了工作日。但问题是我需要在MATLAB中使用CSV,它不允许字符串值。所以,我想将CSV中的星期日转换为7,…,星期一转换为1 但我似乎找不到用Ruby实现这一点的方法。我也不能手动打开excel来做这件事,因为文件太大了。具体来说,我在理解如何访问和指向Ruby中所需的特定列的语法时遇到了问题。例如,如果文件已加载到MATLAB中,并且出于某种原因,我仍然需要将工作日转换为数字,那么我将编写如下简单代码: for i=1:length(Columns(:,1))

我有一个CSV,第一列给出了工作日。但问题是我需要在MATLAB中使用CSV,它不允许字符串值。所以,我想将CSV中的星期日转换为7,…,星期一转换为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))

感谢您的帮助。谢谢。

Ruby中有两个很好的CSV库,根据您所说的,我假设CSV文件没有头(如果它有头,
SmarterCSV
使事情变得更简单)

也就是说,您希望获得第一列:

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文件有很多方法

要保存CSV,您需要使用CSV打开一个新的(或相同的)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

通过这种方式,您可以将CSV作为二维数组加载、转置,并仅对第一列进行操作。

Hello。非常感谢,我正在运行代码,让我们看看它是否有效。什么是
&:
,它是如何工作的?它是要在同一个csv中编辑,还是用一些默认名称创建一个新的csv?我这样问是因为现在,当代码运行时,当我刷新文件夹时,我在文件的“date modified”部分没有看到任何更改。不,这只是要创建一个本地对象。您必须自己重新保存CSV。尝试使用
CSV。打开
。这个注释并没有让我详细说明,我将添加到我的答案中。至于
&
,这代表要处理的符号。您可以在ruby中将其作为一个块传递,类似于说
your_csv.map{| row | row.first}
&:
是一个方便的快捷方式,当您在每个对象上调用单个方法时。
:first
是表示
first
方法的符号,
&
使
映射
将其解释为块。哇。谢谢。它起作用了。我需要一些时间来理解它。但是如果我理解正确的话,就没有办法在Ruby中索引数组,对吗?我的意思是,你可以用上面提到的方法来做,但是这里不可能有
数组(I,j)
操作,对吗?换句话说,如果没有与这些特定值相关的某种公共条件,就不能只访问数组的某些特定值。我说得对吗?顺便说一句,我注意到如果
你的_csv
较小,那么新文件的创建速度实际上会更快,如果
你的_csv
较大,那么创建速度会慢得多。我的意思是,如果你刷新文件夹,看到文件大小改变,如果原始csv变小,速度会快得多,反之亦然。比如,csv需要10倍的时间,3倍的大小。为什么会这样?
your_csv = CSV.parse("your_csv.csv")
convert_weekdays = { "sunday" => 1, "monday" => 2, "tuesday" => 3, "wednesday" => 4, "thursday" => 5, "friday" => 6, "saturday" => 7 }
by_columns = your_csv.transpose
by_columns.first.map! { |row| convert_weekdays[row] }
CSV.open("saved_csv.csv", "w") do |csv|
  by_columns.transpose.each { |row| csv << row }
end