我有一个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等。
答案 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?
之类的东西。