我正在尝试读取文本文件的每一行,其中每行的格式如下:
Bob,Daniels,40,50,60,70,80
我想基于逗号分割每行的内容但由于某种原因,当我这样做时它不起作用:
f = File.open("textfile.txt", "r")
f.each_line do |line|
line.split(",")
end
我在这里做错了什么,或者有更好的方法可以做到这一点吗?
答案 0 :(得分:1)
您应该保存拆分结果,例如将其保存到变量:
result = []
f = File.open("textfile.txt", "r")
f.each_line {|line| result << line.split(",") }
答案 1 :(得分:1)
您正在阅读CSV(“逗号分隔值”)文件,因此请使用现有的CSV课程。 CSV文件有很多特殊情况,天真的split
无法处理。
该文档有许多不同的例子,说明如何从/向文件或字符串进行读取或写入。
例如,从the documentation开始,一次从文件中读取一行:
CSV.foreach("path/to/file.csv") do |row| # use row here... end
在您的代码中,问题是:
f.each_line do |line|
line.split(",")
end
each_line
使用each
块迭代正在读取的文件。
line.split(",")
拆分值但不对其执行任何操作,因此结果将被丢弃。您可以将结果分配给变量或迭代生成的数组:
foo = line.split(",")
# do something with foo
或:
line.split(",").each do |i|
# do something with i
end
但同样,CSV规范并不简单,所以在依赖split
之前要三思而后行。例如,以下行是有效的CSV:
this,"is,some,CSV",data
并应解析为:
["this", "is,some,CSV", "data"]
但split(",")
会错误地生成:
["this", "\"is", "some", "CSV\"", "data"]
并且,因为它错了,所以需要进行大量的额外清理。
split
在一组简单的逗号分隔值上似乎是安全的,导致您认为在遇到上述类型的情况之前它对所有内容都是安全的。
答案 2 :(得分:0)
从逗号分隔文件输出姓氏字段:
计划
f.each_line do |line|
fields = line.split(",")
puts fields[1]
end
输入(textfile.txt)
Bob,Daniels,40,50,60,70,80
John,Smith,40,50,60,70,80
<强>输出强>
Daniels
Smith