Matlabを使用してStackExchangeAPIからデータにアクセスするにはどうすればよいですか?
ナイーブ
sitedata = urlread('http://api.stackoverflow.com/1.1/questions?tagged=matlab')
データが圧縮されているため失敗します。ただし、これを(を使用してfprintf(fileID,'%s',sitedata)
)ファイルに書き込むと、解凍できないzipファイルが取得されます。
Matlabを使用してStackExchangeAPIからデータにアクセスするにはどうすればよいですか?
ナイーブ
sitedata = urlread('http://api.stackoverflow.com/1.1/questions?tagged=matlab')
データが圧縮されているため失敗します。ただし、これを(を使用してfprintf(fileID,'%s',sitedata)
)ファイルに書き込むと、解凍できないzipファイルが取得されます。
urlwrite()
代わりに試してください:
urlwrite('http://api.stackoverflow.com/1.1/questions?tagged=matlab',...
'tempfile.zip')
gunzip('tempfile.zip')
fid = fopen('tempfile');
str = textscan(fid,'%s',Delimiter','\n');
fclose(fid);
このスニペットのより良いバージョンは、tempname
一時的なファイル名を動的に生成するために使用します。
Matlaburlread
は、バイナリではなくテキストデータを取得していることを前提としています。gzipバイナリデータはurlread
、文字データをUnicode値にデコードしてMatlabに固定するchar
とき、またはformatted-outputfprintf
関数がそれらを書き出して、UTF-8または使用しているデフォルトの文字エンコードにエンコードするときに混乱します。バイトシーケンスのfileID
変更と変更、またはその両方。
IIRCは、urlread
デフォルトでISO-8859-1エンコーディングを使用します。これは、バイトが同じ数値のUnicodeコードポイントに変換されることを意味します。つまり、事実上、拡張するだけです。したがって、を実行することでバイトデータを取り戻すことができますsitebytes = uint8(sitedata)
。(これは通常のuint8()
変換であり、ではありませんtypecast()
。)(そうでない場合は、おそらくurlread
'sCharSet
オプションをいじることができます。)
urlread
エンコーディングとキャストをいじって適切なバイトを取得できない場合は、ドロップダウンしてJavaに対して呼び出しを行いHttpAgent
、文字urlread
セットのデコード手順をバイパスするか、オプションをいじることができます。urlread
それを行う方法については、ソースを参照してください。
メモリに適切なバイトがあれば、低レベルの関数を使用してファイルに書き出すことができますfwrite()
。これは、文字セットエンコーディングを実行してもバイトを壊すことはありません。次に、サイトの元の応答の有効なgzipファイルが作成されます。(char文字列を直接使用するだけでも機能すると思いますfwrite(fileID, sitedata, 'uint8')
が、私見では醜いです。)
また、Javaクラスを使用してメモリ内で解凍し、ファイルシステムへのアクセスを節約することもできます。jsitebytes = typecast(sitebytes 'int8')
それらをJavaに適した署名付きバイトとして取得し、それをに貼り付けて、ByteArrayInputStream
を介して読み取りますGZIPInputStream
。byte[]
Matlabは、必要に応じて参照によってバッファーを渡すことはうまく機能しないため、小さなJavaヘルパークラスを作成する必要がありjava.io
ますが、このようにメモリ内で多くの変更を行う場合は価値があるかもしれません。
Webサービスやより洗練されたデータのダウンロード(セッションや証明書が必要なサイトなど)を使用する場合、 Matlab内からHttpAgent
およびクラスに対して直接ドロップダウンしてコーディングすることになります。java.io