如何从文本文件中分割行读取

时间:2017-04-04 19:57:46

标签: ruby file split

我正在尝试读取文本文件的每一行,其中每行的格式如下:

Bob,Daniels,40,50,60,70,80

我想基于逗号分割每行的内容但由于某种原因,当我这样做时它不起作用:

f = File.open("textfile.txt", "r")
f.each_line do |line|
  line.split(",")
end

我在这里做错了什么,或者有更好的方法可以做到这一点吗?

3 个答案:

答案 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