如何将数组的某些元素复制到Ruby之前的某个位置?

时间:2015-10-28 12:35:59

标签: ruby csv

我有一个CSV文件Original.csv,我检查所有行,看看第28列中的元素是否为空。如果它不是空的,我想将第28,31,33和34个元素复制到它们之前的位置;如果它是空的,那么我不想做任何事情。然后,我想将内容存储在新文件New.csv中。这是我的代码:

require 'csv'
CSV.open('New.csv', "wb") do |csv|
   CSV.foreach('Original.csv') do |row|
       if row[28]!=nil
            row[27]=row[28]
            row[30]=row[31]
            row[32]=row[33]
            row[33]=row[34]
        end
        csv<<row
   end
end

但是,程序会复制列而不检查条件!有什么问题?

编辑:我弄明白了这个错误。事实证明,我认为是空的,即"",实际上是一个空间,即" "。这个愚蠢的事情需要4个小时的时间!所以,如果有人面临类似的问题,那么外卖就是 - 看起来不一定是什么东西。所以要小心。一种方法是不在MS Excel中打开文件,而是在一些原始应用程序中打开,如Notepad,Sublime等。

1 个答案:

答案 0 :(得分:0)

当你不期望它时,if row[28]!=nil看起来好像是假的。有几个可能的原因:

as commenter undur_gongor写道: &#34;在Ruby中,空字符串&#39;&#39;不比较等于零。他们甚至是不同的班级&#34;

<强>因此: 除非第[28]行实际包含if row[28]!=nil对象,否则true将评估为nil。如果它包含空字符串(例如''""),则会评估为false

<强>解决方案: 确保你的&#34; if&#34;声明实际上是按照您的预期进行评估。我的猜测是,如果事实证明问题是你有一些空格,你想要row[28].empty?row[28].strip.empty?之类的东西。