2012-08-09 63 views
0

我有一个文件,该文件内容是这样的:拆分一行到列

first;48548a;48954a,48594B 
second;58757a;5875b 
third;58756a;58576b;5867d;56894d;45864a 

而且我想改变这样的格式:

first;48548a 
first;48954a 
first;48594B 
second;58757a 
second;5875b 
third;58756a 
third;58576b 
third;5867d 
third;56894d 
third;45864a 

在bash,我可以使用这个命令,使其发生:

awk -F\; '{for(n=2; n<=NF; n++) { printf("%s;%s\n",$1,$n); }}' input.txt 

但现在我想用Ruby来这样做。我怎样才能做到这一点?

回答

4

该做的伎俩:

IO.readlines("input.txt").each do |line| 
    num, *data = line.strip.split(/[;,]/) 
    data.each do |s| 
    puts "#{num};#{s}" 
    end 
end 

注意两个@evfwcqcg和我都占什么可能是一个错字,逗号作为第一行记录分隔符。

+0

就个人而言,我宁愿使用'num,* data = line.strip.split(/ [;,] /)'来转移',因为它不会改变任何地方,'data'的含义不是在其一生中改变。 – 2012-08-09 03:41:24

+0

@AndrewMarshall是的,我也更喜欢那个!感谢您的建议;我已经更新了我的答案。 – 2012-08-09 03:53:35

+0

嗨Darshan,(*)在*数据中的功能是什么? – adhown 2012-08-09 08:34:16

2
s = <<-STR 
first;48548a;48954a,48594B 
second;58757a;5875b 
third;58756a;58576b;5867d;56894d;45864a 
STR 

def disp(number, *elems) 
    puts elems.map { |e| "#{number};#{e}" } 
end 

ar = s.split.each {|x| disp(*x.split(/[;,]/)) } 

# => first;48548a 
# => first;48954a 
# => first;48594B 
# => second;58757a 
# => second;5875b 
# => third;58756a 
# => third;58576b 
# => third;5867d 
# => third;56894d 
# => third;45864a 
0

我正确地假设你正在将它作为文本文件读入脚本吗?为了让您一开始,File.open(textfile).each do (code code code) end 从那里,看看什么evfwcqcg与分裂这样的线说:

File.open(textfile).each do |line| x = line.split(/[;,]/) end

我想。我不太确定,但我认为这个论点是正则表达式?请有人解释。然后,将这些行分成自己的数组(一次一个)。从那里开始,您只需循环浏览它们,并在每个打印行的开头保留line[0]

+0

你在问自己的答案吗? – 2012-08-09 03:39:45

+0

嗨布拉德,你的假设是正确的。我不太明白他(evfwcqcg)上面的解释。 – adhown 2012-08-09 08:56:17

+0

@AndrewMarshall,是非法的吗?我也在这里学习。 – 2012-08-09 15:27:05