如何使用RubyreplaceCSV中指定列的值?

我有一个CSV,第一列给出了工作日。 但问题是,我需要在MATLAB中使用CSV,它不允许string值。 所以,我想把星期天的星期一换成7,…,星期一换成1。

但是我似乎无法在Ruby中find这样的方法。 我无法手动打开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.open打开一个新的(或相同的)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 

对不起,这有点不雅,在Ruby中编写CSV并不总是最简单的事情! 请注意,大括号{}do end相同,但当内部块只有一行时,通常使用花括号{}

编辑:这个方法对于大文件可能要快一点:

 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 

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