2017-04-04 70 views
0

我想在每行的格式像这样的文本文件的每一行改为:如何分割线从文本文件中读取

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

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

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

我在做什么错在这里或者是有更好的方法我可以这样做呢?

+0

你的程序没有行输出任何东西,所以我不知道你会期望什么。请给出[mcve]和更好的解释问题。 –

+0

您正在阅读逗号分隔值(CSV)文件。使用现有的[CSV](https://ruby-doc.org/stdlib-2.4.1/libdoc/csv/rdoc/CSV.html)类。 CSV文件看起来很简单,但有一些特殊情况,一个简单,朴素的“split”不能处理。 –

回答

0

您应该保存分裂的结果,例如,它保存到变量:

result = [] 
f = File.open("textfile.txt", "r") 
f.each_line {|line| result << line.split(",") } 
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 
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(",")会错误地产生:

​​

,而且因为它是错的,有会有很多额外的清理需要。

split在一组简单的逗号分隔值上看起来很安全,这让您认为它对所有事物都是安全的,直到遇到上述类型的情况。