2012-07-26 14 views
11

初めてのポスターですので、必要なヘルプをできるだけ明確にしようと思います。私はRにかなり新しいです、そして、これは私の最初の本当の独立したプログラミング経験です。大きな異例のファイルをRにインポート

在庫データは約2.5年あり、毎日独自のファイルがあります。ファイルは.txtで、およそ2千万〜3千万の行から構成されており、平均して360mbと推測されます。私は今のところ一度に一つのファイルを扱っています。これらのファイルに含まれるすべてのデータが必要なわけではありません。ファイルを最小限に抑えるためにプログラミングを使用できることを期待していました。

私の問題は、適切なコードを書くことにいくつかの困難を抱えているため、Rは必要なことを理解するためです。

最初にいくつかのデータを表示して、フォーマットのアイデアを得ることができます。

M977 
R 64266NRE1VEW107 FI0009653869 2EURXHEL 630 1 
R 64516SSA0B 80SHB SE0002798108 8SEKXSTO 40 1 
R 645730BBREEW750 FR0010734145 8EURXHEL 640 1 
R 64655OXS1C 900SWE SE0002800136 8SEKXSTO 40 1 
R 64663OXS1P 450SWE SE0002800219 8SEKXSTO 40 1 
R 64801SSIEGV LU0362355355 11EURXCSE 160 1 
M978 

データの別のスニップは:

M732 
D 3547742 
A 3551497B 200000 67110 02800 
D 3550806 
D 3547743 
A 3551498S 250000 69228 09900 

だから、あなたが見ることができるように、それぞれの行は文字で始まります。それぞれの文字は、行の意味を示します。たとえばRは注文書ディレクトリメッセージを意味し、Mは最後の1秒後のミリ秒を意味し、Hは株式取引アクションメッセージを意味します。合計14種類の文字が使われています。

私はreadLines関数を使ってデータをRにインポートしましたが、これはデータを扱うときにRが処理するのに非常に時間がかかるようです。

ここで最初の文字がRで、オフセット1から4までのコードはマーケットセグメント識別子などを意味するIf関数を記述したいと思います。より構造化された方法でデータを送信する。

このようなデータをインポートし、何らかの形式の構造を作成する、つまり一度に1つの在庫を一度に分析するためにデータ行に一意のID情報を使用するなどの方法があります。

答えて

1

あなたはこのような何かを試すことができます。

options(stringsAsFactors = FALSE) 

f_A <- function(line,tab_A){ 
    values <- unlist(strsplit(line," "))[2:5] 
    rbind(tab_A,list(name_1=as.character(values[1]),name_2=as.numeric(values[2]),name_3=as.numeric(values[3]),name_4=as.numeric(values[4]))) 
} 

tab_A <- data.frame(name_1=character(),name_2=numeric(),name_3=numeric(),name_4=numeric(),stringsAsFactors=F) 

for(i in readLines(con="/home/data.txt")){ 
    switch(strsplit(x=i,split="")[[1]][1],M=cat("1\n"),R=cat("2\n"),D=cat("3\n"),A=(tab_A <- f_A(i,tab_A))) 
} 

そしてdata.frameの各タイプに値を追加するさまざまな機能によりcat()を交換してください。関数f_A()のパターンを使用して、テーブル構造に対して他の関数と同じことを構築します。

+0

ご返信ありがとうございます。私は行全体を分割することができましたが、データ全体についてのみ行うことができました。私は次のコードを使用しました 'コード 開始= c(1,16,30,38,46,50,54) 終了= c(14,28,35,43,47,50,55) ldata = x =部分文字列(データ、rep(開始、rep(ldata、 lstarts) ' このコードを各初期値に割り当てることはできますか?私は各手紙の後にそれを書き出そうとしましたが、それはうまくいかないようです。フィードバックをお寄せいただきありがとうございます – Morten

0

readLines()コマンドを正規表現と組み合わせることができます。正規表現についての詳細な情報を入手するには、だから、あなたはそれが何を意味するのか、各行をチェックし、すべてのラインを通過した後、ハンドルやラインのコンテンツを保存することができますgrep()

> ?grep 

のためのRのヘルプサイトを見てくださいあなたの好きなように。 (正規表現は1行でデータを分割するのにも便利です...)

関連する問題