2014-01-12 2 views
6

데이터를 파싱하기 전에 CSV 파일에서 헤더의 유효성을 검사해야합니다.루비의 CSV 파일에서 헤더를 가져 오는 방법

# convert the data into an array of hashes 
CSV::Converters[:blank_to_nil] = lambda do |field| 
    field && field.empty? ? nil : field 
end 
csv = CSV.new(file, :headers => true, :header_converters => :symbol, :converters => [:all, :blank_to_nil]) 
csv_data = csv.to_a.map {|row| row.to_hash } 

나는 나는 그들이 경우는 true 헤더

headers = csv.headers 

그러나 headers method에 문제가 헤더를 사용하지 않을 경우는 "반환 값이 nil 일을 얻을 헤더에게 방법을 사용할 수 있습니다 알고 있지만 아직하지 않은 읽은 후 또는 실제 헤더를 읽은 후. "

그래서 headerstrue입니다 csv_data = csv.to_a.map {|row| row.to_hash } 선 위에 headers = csv.headers을 넣어 내가 데이터를 읽은 후 그것을 놓으면 경우, headers 배열에 헤더 행이 포함되어 있습니다. 그것은 테스트하기가 매우 어렵고 나쁜 프로그래밍 인 나의 방법에 명령 순서를 부과합니다.

이 시나리오에서 주문을 부과하지 않고 헤더 행을 읽는 방법이 있습니까? 나는 루비 2.0을 사용하고있다.

답변

0

저는 문제가 발생하지 않습니다. 반복기 메소드 중 하나를 사용하는 경우 헤더에서 몇 가지 유효성 검사를 수행하는 것이 매우 쉽습니다.

CSV.foreach('tmp.txt', headers: true) do |csv| 
    return unless csv.headers[0] != 'xyz' 
end 
3

문제가 발생합니다. 나는 같은 것을 가지고있다.

data = CSV.new(file, **flags) 
data.headers # => true 

data = CSV.new(file, **flags).read 
data.headers # => ['field1', 'field2'] 

내가 잘 모르는 것 같아요 다른 부작용이있을 수 있습니다, 그러나 이것은 나를 위해 작동 너무 나쁜 냄새가 나지 않습니다 read를 호출하면합니다 ( headers 변수를 채 웁니다) 당신이 원하는 할 것 같다.

9
CSV.open(file_path, &:readline) 
관련 문제