2014-04-05 2 views
1

루비를 사용하여 CSV 파일의 열을 재정렬하려고합니다.CSV 파일의 열 순서를 어떻게 재 배열합니까?

하기 전에 :

$ cat foo.csv 
foo,bar,foobar 
1,2,3, 
4,5,6, 
7,8,9, 

후 : 불행하게도

bar,foo,foobar 
2,1,3, 
5,4,6, 
8,7,9, 

내가 파일을 쓸 때, 나는과 같이 ","값을 추가로 얻을 :

bar,foo,foobar 
"2,1,3, 
","5,4,6, 
","8,7,9, 
" 

사람이 수 csv 파일에 추가 인용 부호가 나타나는 이유를 알아 보도록 도와주십시오.

저는 루비가 처음이에요. 그래서 내 코드가 이상적이지 않으면 다른 아이디어를 열어 둡니다.

require 'csv' 

acsv = CSV.read("./foo.csv", {headers:true, return_headers:false}) 
@headers = CSV.open("./foo.csv", 'r', :headers => true).read.headers 

# Rearrange headers 
temp_index = @headers[0] 
@headers[0]  = @headers[1] 
@headers[1]  = temp_index 

# Rearrange Columns 
acsv.each do |row| 
    temp_index = row[0] 
    row[0]  = row[1] 
    row[1]  = temp_index 
end 

puts "acsv is" 
puts "#{acsv}" 

# Example to write headers http://stackoverflow.com/questions/15905985/how-to-write-columns-header-to-a-csv-file-with-ruby 
newcsv = CSV.open("bar.csv", "wb", write_headers: true, headers: @headers) do |csv| 
    csv << acsv 
end 

업데이트 헤더의 제거 불필요한 변환 headers_array하는

+0

어떻게 CSV 파일이 보이나요? 결국 CSV에 끝에 쉼표가 붙은 이유는 무엇입니까? –

+0

@Cupcake 질문을 편집했습니다. 문자 그대로 foo, bar, foobar ... – spuder

+0

왜 CSV에 끝에 쉼표가 있습니까? –

답변

2

당신은 그것을 간단하게 할 수 있습니다 , t 때문에 그는 CSV 파일의 끝에 쉼표를 추가합니다. 해야합니다 알렉스의 솔루션을 결합

foo,bar,foobar 
1,2,3 
4,5,6 
7,8,9 

: 여기

require 'csv' 

CSV.open("./bar.csv", "wb") do |csv| 
    CSV.read("./foo.csv").each do |line| 
    csv << [line[1], line[0], line[2]] 
    end 
end 
1

시도 :

require 'csv' 

result = [] 

CSV.read("./foo.csv").each do |line| 
    result << [line[1], line[0], line[2]] 
end 

CSV.open("./bar.csv", "wb") do |csv| 
    result.each{ |line| csv << line } 
end 

을 그리고 일부 빈 열이 있었다 :

require 'csv' 

CSV.open('./foo-reversed.csv','wb') do |csv| 
    CSV.read('./foo.csv','r').each do |row| 
    csv << row.reverse 
    end 
end 
3

는 다음 bar 행으로 foo 행을 교환, 그들을 전치에 의해 열을 행으로 설정하여, 당신이 할 수있는 또 다른 방법 다시 자리 옮김 :

require 'csv' 

csv = CSV.read("./foo.csv", { headers: true, return_headers: false }) 
csv = csv.to_a.transpose 
csv[0],csv[1] = csv[1],csv[0] 
csv = csv.transpose 

CSV.open("./foo.csv", "wb") do |lines| 
    csv.each { |line| lines << line } 
end 
+0

이것은 정말 좋은 기술입니다. 다음 코드 수정에서이 아이디어를 구현할 것입니다. – spuder

+0

이 전략은 많은 열이있는 CSV 파일에서 임의의 열을 쉽게 순서를 재조정 할 수 있다는 이점 (다른 답변과 비교하여)이 있습니다. – Dennis

관련 문제