2012-08-09 57 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