2016-11-23 6 views
2

내 Ruby 환경은 Ruby 2.3.1 및 Rails 5.0.0.1입니다.Ruby에서 가져올 때 문자열 음수를 정수로 변환하는 중 오류가 발생했습니다.

내가 예를 들어, 정수에 부정적인 문자열 숫자로 변환하려고 해요 :

나는이 전원을 다시 "-2000"는 IRB 터미널에서, 나는 결과가 -2000 예상 있어요

그러나이 데이터를 CSV 파일에서 가져 오면 변환하려고합니다.

나는 다음과 같은 정보를 사용하고 있습니다 :

CSV 파일

345,­-2000 
345,120000 

코드 파일

CSV.foreach("file.csv") do |row| 
    p [row[0], row[1]] 
    p row[1].to_i 
    p row[1].force_encoding('UTF-8').to_i 
    p Integer(row[1]) 
    p Integer(row[1].force_encoding('UTF-8')) 
end 

내가있어 그 :

["345", "­-2000"] 
0 
0 
'Integer': invalid value for Integer(): "\xC2\xAD2000" (ArgumentError) 
'Integer': invalid value for Integer(): "\xC2\xAD2000" (ArgumentError) 

정수를 사용하여() , 나는 그걸 발견했다. ign는 "\ xC2 \ xAD"로 표시됩니다.

요약하면 to_i 메서드는 "\ xC2 \ xAD2000"을 0으로 변환하고 Integer()가 오류를 발생시킵니다.

누군가 도움을 줄 수 있습니까?

감사합니다.

+0

이 데이터의 출처 및/또는 CSV는 (으)로 인코딩 된 데이터는 무엇입니까? 이 자습서는 도움이 될 수 있습니다 - http://www.justinweiss.com/articles/3-steps-to-fix-encoding-problems-in-ruby/ –

+0

@DamienRoche 이것은 CSV 확장자가있는 단순한 파일입니다. 이 파일을 인코딩하지 않았습니다. CSV 클래스를 사용하여 배열의 한 줄에있는 각 행을 바꿉니다. 나는이 튜토리얼을 보게 될 것이다. 감사. –

+0

'force_encoding'은 매우 특정한 경우에만 사용해야합니다. 파일을 열 때 거의 절대 사용하지 않습니다 (파일의 전체 인코딩을 따르지 않는 특정 텍스트가 있다는 것을 알지 못하는 경우). 대신 CSV를 열 때 인코딩을 지정해야합니다. [the doc] (http://ruby-doc.org/stdlib-2.3.1/libdoc/csv/rdoc/CSV.html#method-c-foreach)를 참조하십시오. – Kelvin

답변

1
당신이 실제로 여기에 두 개의 문자가있는 것 같습니다

..

, 나는 문자의 조합을 대체 할 것이다 실제 하이픈으로 변환 한 다음 정수로 변환합니다.

CSV.foreach("file.csv") do |row| 
    p row[1].sub("\xC2\xAD", '-').to_i 
end 

그거, 또는 원본 파일을 정리하십시오. 어떻게 생성하는지에 대한 확신은 있지만 조사할만한 가치가 있습니다.