Hello -
New R. user here.
I was wondering if you could point me in the right direction:
- I save the output of a WMIC query to a temp text file on Windows 2008
using Ruby:
system(“wmic MEMORYCHIP get CAPACITY /VALUE > tmp”)
- Next, I try to read this file back in order to extract a value from
the output:
contents = File.open(‘tmp’, ‘r:’) { |f| f.read }
However, when I run this in irb, the file is imported with the following
leading characters: \x00 and others. If I open the actual tmp file in
Windows, it displays the correct text.
Is there a way to just import that text only? Is this something to do
with encoding?
Thank you for your help.
Here is the entire session in irb:
irb(main):002:0> system(“wmic MEMORYCHIP get CAPACITY /VALUE >
tmp”)
=> true
irb(main):003:0> contents = File.open(‘tmp’, ‘r:’) { |f| f.read }
=>
“\xFF\xFE\n\x00\n\x00N\x00o\x00d\x00e\x00,\x00C\x00a\x00p\x00a\x00c\x00i\x00t
\x00y\x00\n\x00\n\x00P\x00S\x00,\x008\x005\x008\x009\x009\x003\x004\x005\x009\x0
02\x00”
irb(main):004:0>
On Thu, 7 Apr 2011 04:30:13 +0900, Angelo NN wrote:
the output:
Thank you for your help.
02\x00"
irb(main):004:0>
–
Posted via http://www.ruby-forum.com/.
As it starts with a UTF-16 LE Byte order marker, that’s a pretty good
clue as to the encoding.
-jh
Jonathan H. wrote in post #991289:
On Thu, 7 Apr 2011 04:30:13 +0900, Angelo NN wrote:
the output:
Thank you for your help.
02\x00"
irb(main):004:0>
–
Posted via http://www.ruby-forum.com/.
As it starts with a UTF-16 LE Byte order marker, that’s a pretty good
clue as to the encoding.
-jh
Thank you.
Can you suggest where I can read/etc. about how to change the encoding
for the imported text? (e.g. contents.encode(“UTF-16 LE”) ? )
Jonathan H. wrote in post #991291:
On Thu, 7 Apr 2011 04:35:44 +0900, Angelo NN wrote:
for the imported file?
I’m not at all familiar with dealing with encodings on Windows, but
assuming you’re using a 1.9x ruby,
contents = File.open(‘tmp’, ‘r:utf-16’) { |f| f.read }
or perhaps
contents = File.open(‘tmp’, ‘r:utf-16le’) { |f| f.read }
Given the BOM, I’d hope that the former might work.
-jh
Thanks - I tried utf-16. Unfortunately it gives a “Unsupported encoding
utf-16 ignored” message. Maybe it’s time to switch to another Operating
System for me
contents = File.open(‘tmp’, ‘r:utf-16’) { |f| f.read }
(irb):15: warning: Unsupported encoding utf-16 ignored
=>
“\xFF\xFE\n\x00\n\x00\n\x00\n\x00C\x00a\x00p\x00a\x00c\x00i\x00t\x00y\x00=\x0
08\x005\x008\x009\x009\x003\x004\x005\x009\x002\x00\n\x00\n\x00\n\x00\n\x00\n\x0
0\n\x00”
On Thu, 7 Apr 2011 04:58:54 +0900, Angelo NN wrote:
or perhaps
contents = File.open(‘tmp’, ‘r:utf-16’) { |f| f.read }
(irb):15: warning: Unsupported encoding utf-16 ignored
=>
“\xFF\xFE\n\x00\n\x00\n\x00\n\x00C\x00a\x00p\x00a\x00c\x00i\x00t\x00y\x00=\x0
08\x005\x008\x009\x009\x003\x004\x005\x009\x002\x00\n\x00\n\x00\n\x00\n\x00\n\x0
0\n\x00”
I think the old ways still work:
require ‘iconv’
content=File.binread(‘tmp’)
TO FROM (set TO to ‘native encoding’)
text = Iconv::conv(“utf-8”,‘utf-16’, content)
puts text
-jh
On Thu, 7 Apr 2011 04:35:44 +0900, Angelo NN wrote:
for the imported file?
I’m not at all familiar with dealing with encodings on Windows, but
assuming you’re using a 1.9x ruby,
contents = File.open(‘tmp’, ‘r:utf-16’) { |f| f.read }
or perhaps
contents = File.open(‘tmp’, ‘r:utf-16le’) { |f| f.read }
Given the BOM, I’d hope that the former might work.
-jh
Jonathan H. wrote in post #991297:
On Thu, 7 Apr 2011 04:58:54 +0900, Angelo NN wrote:
or perhaps
contents = File.open(‘tmp’, ‘r:utf-16’) { |f| f.read }
(irb):15: warning: Unsupported encoding utf-16 ignored
=>
"\xFF\xFE\n\x00\n\x00\n\x00\n\x00C\x00a\x00p\x00a\x00c\x00i\x00t\x00y\x00=\x0
08\x005\x008\x009\x009\x003\x004\x005\x009\x002\x00\n\x00\n\x00\n\x00\n\x00\n\x0
0\n\x00"
I think the old ways still work:
require ‘iconv’
content=File.binread(‘tmp’)
TO FROM (set TO to ‘native encoding’)
text = Iconv::conv(“utf-8”,‘utf-16’, content)
puts text
-jh
Wow - Awesome.
That worked.
Thanks Jonathan!