2016-02-02 12 views
7

私はメモリに巨大なXMLファイルを読み取るためにxml2パッケージを使用していますを作成しようと、コマンドは次のエラーで失敗します。問題XML2パッケージで大きなXMLファイルを読み込み、作業閉鎖

Error: Char 0x0 out of allowed range [9]

私のコード次のようになります。

library(xml2) 
doc <- read_xml('~/Downloads/FBrf.xml') 

データは(140メガバイト程度)ftp://ftp.flybase.net/releases/FB2015_05/reporting-xml/FBrf.xml.gzでダウンロードし、それが1.8ギガバイトについて持って展開することができます。

誰かに、問題のある文字やファイルを読む前にどのように消去するかを知る方法があります。

[OK]を

EDIT、ファイルがかなり大きいので、私は、スタックオーバーフロー上の他のソリューションを検索し、私がやっていること、彼はそうここCombine values in huge XML-files

を提示マーティンモーガンからソリューションを実装しようこれまでのところ、私は私のサーバーにxmlファイルをアップロード

library(XML) 
branchFunction <- function(progress=10) { 
    res <- new.env(parent=emptyenv()) # for results 
    it <- 0L       # iterator -- nodes visited 
    list(publication=function(elt) { 
     ## handle 'publication' nodes 
     if (getNodeSet(elt, "not(/publication/feature/id)")) 
      ## early exit -- no feature id 
      return(NULL) 
     it <<- it + 1L 
     if (it %% progress == 0L) 
      message(it) 
     publication <- getNodeSet(elt, "string(/publication/id/text())") # 'key' 
     res[[publication]] <- 
      list(miniref=getNodeSet(elt, 
        "normalize-space(/publication/miniref/text())"), 
       features= xpathSApply(elt, "//feature/id/text()", xmlValue)) 
    }, getres = function() { 
     ## retrieve the 'res' environment when done 
     res 
    }, get=function() { 
     ## retrieve 'res' environment as data.frame 
     publication <- ls(res) 
     miniref <- unlist(eapply(res, "[[", "miniref"), use.names=FALSE) 
     feature <- eapply(res, "[[", "features") 
     len <- sapply(feature, length) 
     data.frame(publication=rep(publication, len), 
        feature=unlist(feature, use.names=FALSE), 
        miniref=rep(miniref, len)) 
    }) 
} 

branches <- branchFunction() 
xmlEventParse("~/Downloads/jnk.xml", handlers=NULL, branches=branches) 
# xmlEventParse("~/Downloads/FBrf.xml", handlers=NULL, branches=branches) 
branches$get() 

次のコード行であるhttp://download.dejung.net/jnk.xml

ファイルには数KBしかありませんが、問題はその結果です。 2番目のパブリケーションエントリは、FBrf0162243というIDと、Schwartz et al., 2003, Mol. Cell. Biol. 23(19): 6876--6886というミニIDを持ちます。

私が上に掲示したコードからの私の結果は、間違った出版IDを対応するminirefに報告します。機能IDは

FBrf0050934 FBgn0003277 Schwartz et al., 2003, Mol. Cell. Biol. 23(19): 6876--6886

ない私のコードが間違った値を報告している理由は、これは私にとって非常に新しいものであることから、多分誰かが閉鎖で私を助けることができることを確認....正しいです。

+0

これは、それ自体でエンコーディングを推測しようとするかもしれない 'read_html'を試してみてください。 – Rentrop

+0

'dat hrbrmstr

+0

@hrbrmstrこれらの文字を削除するだけですか?そしてどうやって? @ Floo0昨日私は 'read_html'を試しましたが、それは20分以上かかってしまい、プロセスをやめる必要がありました。今日もう一度試して、それが走っているかどうかを見てみましょう。 'read_xml'コマンドは数分後に終了します。 – drmariod

答えて

1

このメッセージの0x0が同じNULLの問題を意味する場合は、これに類似する可能性のある「埋め込みNULL」というエラーメッセージが時折発生することがあります。私のアプローチは、ファイルを読み込む前にファイルを削除しようとすることです。ファイルを無視するRパッケージが見つからないためです。これはトリックをしない場合は、文字のこの「ブラックリスト」を展開することをお勧めします

system('sed "s/\\0//g" ~/Downloads/dirty.xml > ~/Downloads/clean.xml') 

:UNIXまたはOS X上にある場合

、あなたは経由でRプログラムでsedを呼び出すことができます - 何かがまだ間違っている場合は、時々私は、文字のホワイトリスト作成例Unicode Regex; Invalid XML characters

を参照 - ..ない指定された文字セットのすべてを削除し

sed 's/[^A-Za-z0-9 _.,"]//g' ~/Downloads/dirty.csv > ~/Downloads/clean.csv

あなたは、Windows上にある場合、あなたはおそらく持っている

:あなたは多分[^[:ascii:]]のようなものにそれを拡張したいと思いますので、

これは、私が(約</etc.>を気にしない).CSVデータファイルに使用するものですこのアプローチのためにRの外に出て行くことができます。例えば上記のsystem()の代わりにCygwinを使うことができます。

1

コマンドラインで、ファイルにiconv -f utf-8 -t utf-8 FBrf.xml > outfile.xml というコマンドを実行しました。それは目に見えて差をつけましたが、私はそれをテストするためにRをインストールしていません。

(Windows上で、あなたはiconvのへのアクセスを得るためにCygwinをインストールする必要があるならば)

+0

iconvは別のオプションですが、私はそれで多くの成功を収めていません。 Windows Rでも機能があります。 ( '?iconv'を参照してください)' readLines'と 'iconv'の組み合わせはオプションになります。 – C8H10N4O2