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