2010-06-22 2 views
0

CSV 파일을 열고 File.open (filename)을 사용하여 값을 읽습니다.Ruby - 이진 문자열을 일반 문자열로 언팩하는 방법은 무엇입니까?

그래서 나는 같은 것을 할 :

my_file = File.open(filename) 
my_file.each_line do |line| 
line_array = line.split("\t") 
ratio = line_array[1] 
puts "#{ratio}" 
puts ratio.isutf8? 
end 

나는 데 문제가 line_array의 값입니다 이상한 형식으로 보인다. 예를 들어 CSV 파일의 셀에있는 값 중 하나는 0.86입니다. 인쇄 할 때 "0. 8 6"처럼 보입니다.

문자열과 비슷하게 동작하지만 인코딩 방법을 잘 모르겠습니다. 좀 반성 할 때 : 도대체

ratio.isutf8? 
I get this: 
=> undefined method 'isutf8?' for "\0000\000.\0008\0006\000":String 

을 무슨 일이?! Ratio.to_f를 호출 할 수있는 일반 문자열로 비율을 얻으려면 어떻게해야합니까?

감사합니다.

답변

2

입력 데이터가 UTF-16 or UCS-2으로 인코딩 된 것 같습니다. 이 같은

시도 뭔가 :

require 'iconv' 

ratio = Iconv.conv('UTF-8', 'UTF-16', line_array[1]) 
puts "Ratio is now '#{ratio}'." 

이 와서 그렇지 않으면 말에 길잃은 0 바이트가있을 것입니다, 당신은 아마 거기에 분할을 호출하기 전에 전체 라인에 Iconv.conv를 실행해야합니다 그것을 생각하는 (당신이 구분 기호를 '\ 000 \ t'로 변경하지 않는 한 오히려 추한 것입니다.)

+0

굉장하다. 그것이 어떻게되는지 알려 줄 것입니다! – mymmaster

3

이진 문자열의 언팩은 일반적으로 디코딩이라고합니다. 데이터가 UTF-16 인 것 같지만 사실이라고 가정하기 전에 실제로 사용중인 인코딩 (예 : 제작 한 워크 플로/구성을 조사하여)을 찾아야합니다.

루비 1.9 (즉시 디코드)에서

:

루비 1.8에서
my_file = File.open(filename).set_encoding('UTF-16BE:UTF-8') 
# the rest as in the original 

(다음, 파일 전체를 읽고 디코딩하고 구문 분석, 슈퍼 대용량 파일 작동하지 않을 수 있습니다) :

require 'iconv' 

# … 

my_file = File.open(filename) 
my_text = Iconv.conv('UTF-8', 'UTF-16BE', my_file.read) 
my_text.each_line do |line| 
# the rest as in the original 
end 
+0

훌륭한 응답. 감사! – mymmaster