我有一个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))
感谢任何帮助。感谢。
答案 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作为二维数组加载,转置它,并且只对第一列进行操作。