首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ruby将字符串转换为浮点型将销毁数字

ruby将字符串转换为浮点型将销毁数字
EN

Stack Overflow用户
提问于 2013-05-24 02:40:12
回答 3查看 169关注 0票数 0

我有以下代码:

代码语言:javascript
复制
input=File.open("lala.txt","r")
genes=[]

input.each_line{|li|

    keys=li.split("\t")
    length=keys.length
    puts(keys[length-2])
    puts(keys[length-2].to_f)

    if (keys[0]["-"].class==NilClass && keys[1]["-"].class==NilClass && (keys[length-2]).to_f>0.98)
    genes.push(keys[0])
    genes.push(keys[1])
    end

}

inputfile:

代码语言:javascript
复制
1053_at/RFC2    203696_s_at/RFC2    0.9031699692435061  
117_at/HSPA6    1553158_at/C3orf34  0.9079515773059148  
117_at/HSPA6    1553513_at/VNN3 0.9237382047518812  
117_at/HSPA6    1553723_at/GPR97    0.9367168572635286  
117_at/HSPA6    1557852_at/---  0.9177916032275163  
117_at/HSPA6    1558525_at/---  0.9229865774037962  
117_at/HSPA6    1562481_at/---  0.9109034368848434  
117_at/HSPA6    1569385_s_at/TET2   0.9187904542249753  
117_at/HSPA6    1569830_at/PTPRC    0.900051189462974   
117_at/HSPA6    1569955_at/---  0.9028606652628463  
117_at/HSPA6    201393_s_at/IGF2R   0.9090699277161238

我的问题如下:我想将每一行中的数字与>0.98进行比较。

如果我只写keys[length-2]>0.98,它会显示一个错误,我想要比较一个字符串和一个浮点数。好的。让我们将字符串转换为浮点型,然后执行以下操作:(Keyslength 2).to_f。但它销毁了这个数字:我得到0.0

输出:

代码语言:javascript
复制
0.9031699692435061
0.0
0.9079515773059148
0.0
0.9237382047518812
0.0
0.9367168572635286
0.0
0.9177916032275163
0.0
0.9229865774037962
0.0
0.9109034368848434
0.0
0.9187904542249753
0.0
0.900051189462974
0.0
0.9028606652628463
0.0
0.9090699277161238
0.0
0.9002336615360215
0.0

那是怎么回事呢?(Ruby: linux 1.9.3)提前谢谢

EN

回答 3

Stack Overflow用户

发布于 2013-05-24 03:20:47

从其中所有的空字节判断,您得到的是您解释为utf8或ascii的utf16文本。假设您使用的是ruby1.9,您可以通过执行以下操作来让ruby进行编码

代码语言:javascript
复制
File.open("lala.txt","rb:UTF-16:US-ASCII")

它会将文本转换为默认的内部编码。

票数 1
EN

Stack Overflow用户

发布于 2013-05-24 03:06:39

我认为你有一些奇怪的空格问题。我认为如果你在/\s+/上拆分,只使用keys.last,你应该会很棒:

代码语言:javascript
复制
input=File.open("lala.txt","r")
genes=[]

input.each_line{|li|
  keys=li.split(/\s+/)
  puts(keys.last)
  puts(keys.last.to_f)

  if (keys[0]["-"].class==NilClass && keys[1]["-"].class==NilClass && (keys.last).to_f>0.98)
    genes.push(keys[0])
    genes.push(keys[1])
  end
}
票数 0
EN

Stack Overflow用户

发布于 2013-05-24 03:51:28

您的代码可以编写得更像Ruby,并利用经过良好测试的轮子:

代码语言:javascript
复制
require 'csv'

genes = []
CSV.foreach("lala.txt", :col_sep => "\t") do |row|

  puts row[-1]
  puts row[-1].to_f

  if (!row[0]["-"] && !row[1]["-"] && (row[-1].to_f > 0.98))
    genes << row[0]
    genes << row[1]
  end

end

puts genes

这是输出:

代码语言:javascript
复制
0.9031699692435061
0.9031699692435061
0.9079515773059148
0.9079515773059148
0.9237382047518812
0.9237382047518812
0.9367168572635286
0.9367168572635286
0.9177916032275163
0.9177916032275163
0.9229865774037962
0.9229865774037962
0.9109034368848434
0.9109034368848434
0.9187904542249753
0.9187904542249753
0.900051189462974
0.900051189462974
0.9028606652628463
0.9028606652628463
0.9090699277161238
0.9090699277161238

因为最后一列中的值都不是> 0.98,所以genes为空。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16721494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档