2013-04-09 3 views
16

Ruby로 csv 파일에 열을 쓰는데 문제가 있습니다. 아래 코드는 내 스 니펫입니다.Ruby를 사용하여 csv 파일에 열 헤더를 쓰는 방법은 무엇입니까?

calc = numerator/denominator.to_f 
data_out = "#{numerator}, #{denominator}, #{calc}" 
File.open('cdhu3_X.csv','a+') do|hdr| 
     hdr << ["numerator","denominator","calculation\n"] #< column header 
      hdr << "#{data_out}\n" 
end 

이 코드는 모든 행에 열 머리글을 추가하며 데이터의 각 열 맨 위에 만 필요합니다. 나는 여기와 다른 곳을 수색했지만 그 일을하는 방법에 대한 명확한 답을 찾을 수 없다. 도움을 주시면 대단히 감사하겠습니다.

답변

6

가장 확실한 방법은 파일을 한 번 열고 모드 'w'에서 헤더를 작성한 다음 데이터를 쓰는 것입니다.

기술적 인 이유 (예 : 데이터를 한 번에 모두 사용할 수없는 등)가있는 경우 파일의 IO#tell 메소드를 사용하여 현재 파일 위치를 반환 할 수 있습니다. 당신은 추가에 대한 파일을 열 때, 위치가 파일의 끝으로 설정, 이렇게되어 현재 파일 위치는 제로, 파일이 새로 생성을하고 어떤 헤더가없는 경우 :

File.open('cdhu3_X.csv', 'a+') do |hdr| 
    if hdr.tell() == 0 # file is empty, so write header 
    hdr << "numerator, denominator, calculation\n" 
    end 
    hdr << "#{data_out}\n" 
end 
+0

안녕하세요. 고맙습니다. Jfleck – Joe

38

I가 추천을 당신이 w 옵션을 사용할 수없는 경우

require 'csv' 

CSV.open('test.csv','w', 
    :write_headers=> true, 
    :headers => ["numerator","denominator","calculation"] #< column header 
) do|hdr| 
    1.upto(12){|numerator| 
    1.upto(12){ |denominator| 
     data_out = [numerator, denominator, numerator/denominator.to_f] 
     hdr << data_out 
    } 
    } 
end 

당신은 정말 a+ (예를 들어, 데이터를 한 번에 모두 사용할 수 없습니다), 당신은 다음과 같은 트릭을 시도 할 수 필요 대신 CSV-라이브러리를 사용 :

require 'csv' 

column_header = ["numerator","denominator","calculation"] 
1.upto(12){|numerator| 
    1.upto(12){ |denominator| 
    CSV.open('test.csv','a+', 
     :write_headers=> true, 
     :headers => column_header 
    ) do|hdr| 
      column_header = nil #No header after first insertion 
      data_out = [numerator, denominator, numerator/denominator.to_f] 
      hdr << data_out 
     end 
    } 
} 
2

csv 파일을 처리하는 가장 좋은 방법은 Ruby의 CSV 모듈을 사용하는 것입니다.

CSV 코드를 읽은 후 동일한 문제가 발생했습니다. 가장 효율적인이 솔루션을 발견했습니다.

headers = ['col1','col2','col3'] 

CSV.open(file_path, 'a+', {force_quotes: true}) do |csv| 
    csv << headers if csv.count.eql? 0 # csv.count method gives number of lines in file if zero insert headers 
end 
+1

일부 데이터를 삽입 한 후 원래의 헤더를 어떻게 변경합니까? 추가 열이있을 수 있지만 데이터가 채워진 후에 만 ​​알 수 있습니까? csv.headers.push 시도했지만 출력하는 파일의 실제 헤더를 업데이트하지 않습니다. 감사 – scanales