2016-12-02 4 views
0

私は、このようなmyfile.xml.gzR:大規模なzip形式のXMLファイルの小さなサブセットをロードする方法は?

としてかなり大きなzip圧縮xmlファイルを持っている私は、ファイルの小さなサブサンプルをロードしたいと思いますが、私はxml2::read_xmlまたはXML::xmlTreeParseのいずれかでいくつかのnrowsオプションを見つけることができませんでした。

ファイル全体を直接開こうとすると、コンピュータがクラッシュします(ファイルが大きすぎます)。

xmlファイルのサブセットをデータフレームにロードするにはどうすればよいですか?

+1

多分 'readr :: read_lines(...、n_max = n)は'それはあなたのxml状況のために働くと確信していないが、それがZIPファイルで動作するため – Nate

+0

@NathanDayのおかげで、あなたの入力。残念ながら、最初の 'n '行を' read_lines'で読み込み、 'read_xml'に入力しても動作しません。 –

+0

それはそれほど単純ではないようです。 XMLにはタグがあるので、データをフィルタリングする前に、これらのタグをすべて解析する必要があります。問題は、私のXMLファイルが大きすぎます。私はそこにRの解決策がないと信じられない。 –

答えて

1

を使用してxmlをSAX形式で読み取る。

のは、次のXMLファイルを見てみましょう:

<items> 
    <item> 
    <id>l001</id> 
    <qty>1</qty> 
    <price>10</price> 
    </item> 
    <item> 
    <id>l002</id> 
    <qty>100</qty> 
    <price>10</price> 
    </item> 
    <item> 
    <id>l003</id> 
    <qty>5</qty> 
    <price>12</price> 
    </item> 

    [...] 

</items> 

我々は(代わりにhandlersbranchesを使用して)ツリーとして各itemをロードし、「ハイブリッドモード」でメモリーにすべてを読み込む避けるために、イベントパーサーを使用します。 https://stackoverflow.com/a/31014005/1992669の再利用、これは与える:

library(XML) 

input <- "input.xml" 
items <- NULL 
maxItems <- 50 

parseItem = function (parser, node, ...) { 
    children <- xmlChildren(node) 
    items <<- rbind(items, sapply(children, xmlValue)) 
    if (nrow(items) == maxItems) { 
    xmlStopParser(parser) 
    } 
} 

# with XMLParserContextFunction, we get the parser as first parameter 
# so we can call xmlStopParser 
class(parseItem) = c("XMLParserContextFunction", "SAXBranchFunction") 

xmlEventParse(input, 
       branches = list(item = parseItem), 
       ignoreBlanks = T 
      ) 

items <- as.data.frame(items) 
関連する問題