2012-11-25 8 views
2

나는 이것이 CSV 파일을 구문 분석 할 수 있습니다CSV 가져 오기 문제

csv_file = CSV.parse(
    file.read(), 
    headers:    true, 
    header_converters: :symbol 
) 

의미가 있습니다,하지만 난 추가 그래서 인코딩 유형을 지정하려면 : {encoding: 'UTF-8'}를 다음과 같이 읽기 방법에 :

csv_file = CSV.parse(
    file.read({encoding: 'UTF-8'}), 
    headers:    true, 
    header_converters: :symbol 
) 

하지만이 오류가 발생합니다. 해시를 정수로 변환 할 수 없습니다.

무엇이 잘못되었는지 만 알 수 있습니다. 나는 문서를 체크했으나 그렇게 인코딩을 전달할 수 있다고하지만 첫 번째 인수로 파일을 필요로하므로 거기에 실속 할 수는 있지만 확실하게 이미 읽은 파일이 무엇인지 알고 있으므로 확인해야합니다.

어떻게 해결할 수 있습니까?

업데이트 :

내가 업데이트 한 다음

def import 
    if params[:import_coasters] 
    file = params[:import_coasters][:file] 
    Park.import_from_csv(file) 


def self.import_from_csv(file) 
    Park.destroy_all 

csv_file = CSV.parse(
    File.read(file, {encoding: 'UTF-8'}), 
    headers:    true, 
    header_converters: :symbol 
) 

그러나 나는 다음과 같은 오류 얻을 :

이 ActionDispatch을 변환 할 수 있습니다 :: Http :: UploadedFile 문자열로

+0

가 어떻게 파일 변수를 만드는? 테스트하기 위해 문제를 재현하는 데 문제가 있습니다. – joofsh

+0

이 방법으로 #read를 사용할 수 있다고 말하는 문서를 가리킬 수 있습니까? –

답변

4

끝났습니다. 이 시도 : IO.read에 루비 1.9.3 문서에서

# Step 1: convert the uploaded file object to a file name 
uploaded_file = params[:import_coasters][:file] 
file_name = uploaded_file.path 

# Step 2: To get the input text and see if it's what you expect 
text = File.read(
    file_name, 
    {encoding: 'UTF-8'} 
) 

# Parse the text 
csv_file = CSV.parse(
    text, 
    headers: true, 
    header_converters: :symbol 
) 

을 :. 마지막 인자는 해시 인 경우

", 그것은 내부 개방을위한 옵션()를 지정하는 키는 다음과 같은 것 open_args : 다른 사람들에게 독점적입니다. " 이 파일 실제로 객체 전형적인 루비 아니기 때문에

http://www.ruby-doc.org/core-1.9.3/IO.html#method-c-read

또한, UploadedFile에 대한 설명서를 보면 :

http://api.rubyonrails.org/classes/ActionDispatch/Http/UploadedFile.html

+0

원래 질문에 업데이트가 있는지 확인하십시오. – rctneil

+0

이것에 대한 아이디어가 있으십니까? 나는 정말로 그것을 이해하는 것처럼 보이지 않는다. – rctneil

+0

업데이트가 완전히 다른 질문입니다. 이것은 CSV 구문 분석과 관련이 없습니다. 파일 입력 매개 변수를 파일 이름과 혼합합니다. 이를 확인하려면 단계별로 단계별로 수행하고 각 단계의 결과를 보여줍니다. 파일 매개 변수는 어떤 클래스입니까? 문자열이라면 유효한 파일 이름입니까? 그렇다면 파일을 열어 독서 할 수 있습니까? 그렇다면 텍스트 인코딩이 올바르게 작동합니까? – joelparkerhenderson

1

File.read()가 처음으로 파일 이름을 기대하기 때문이다 논의. 대신 ActionDispatch :: Http :: UploadedFile을 전달하고 있습니다. 당신이 documentation 보면, 당신은 UploadedFile 이미 읽기 방법을 가지고 것을 볼 수 있습니다, 그래서 당신은 시도 할 수 있습니다 :

csv_file = CSV.parse(
    file.read({encoding: 'UTF-8'}), 
    headers:    true, 
    header_converters: :symbol 
)