3

Matlabを使用してStackExchangeAPIからデータにアクセスするにはどうすればよいですか?

ナイーブ

sitedata = urlread('http://api.stackoverflow.com/1.1/questions?tagged=matlab')

データが圧縮されているため失敗します。ただし、これを(を使用してfprintf(fileID,'%s',sitedata))ファイルに書き込むと、解凍できないzipファイルが取得されます。

4

2 に答える 2

5

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一時的なファイル名を動的に生成するために使用します。

于 2013-01-10T00:20:08.060 に答える
3

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を介して読み取りますGZIPInputStreambyte[]Matlabは、必要に応じて参照によってバッファーを渡すことはうまく機能しないため、小さなJavaヘルパークラスを作成する必要がありjava.ioますが、このようにメモリ内で多くの変更を行う場合は価値があるかもしれません。

Webサービスやより洗練されたデータのダウンロード(セッションや証明書が必要なサイトなど)を使用する場合、 Matlab内からHttpAgentおよびクラスに対して直接ドロップダウンしてコーディングすることになります。java.io

于 2013-01-10T08:49:07.893 に答える