2016-12-21 15 views
2

私は、次のテキストファイルの内容を読み取るためにreadLinesを使用しています:R - 文字列と空白行の間でテキストを抽出するには?

*--------------------------------------------------------------------* 
* 7. Measured data             * 
* And option to force measured LAI during simulation    * 
* (instead of using simulated values)        * 
*--------------------------------------------------------------------* 
* Observed phenology: only required if program DRATES is run!! 
IDOYTR = 194 ! Day of transplanting (give 0 if direct-seeded) 
IYRTR = 1991 ! Year of transplanting (give 0 if direct-seeded) 
IDOYPI = 240 ! Day of panicle initiation (give -99 if not observed) 
IYRPI = 1991 ! Year of panicle initiation (give -99 if not observed) 
IDOYFL = 260 ! Day of flowering 
IYRFL = 1991 ! Year of flowering 
IDOYM = 288 ! Day of maturity 
IYRM = 1991 ! Year of maturity 


*Leaf Area Index (m2 leaf/m2 ground): 
LAI_OBS = 
1991., 182., 0.00 , 
1991., 194., 0.028, 
1991., 202., 0.185, 
1991., 211., 0.325, 
1991., 219., 1.048, 
1991., 240., 3.680, 
1991., 254., 5.010, 
1991., 260., 4.628, 
1991., 273., 3.520, 
1991., 288., 1.938 

*-- Parameter to set forcing of observed LAI during simulation 
LAI_FRC = 0  ! No forcing 
*LAI_FRC = 2  ! Forcing 

そして私は、プログラムLAI_OBS =で識別されるテキストのブロックのみを抽出する必要があります。 LAI_OBS =が配置されている行番号は、ファイルごとに異なります。したがって、文字列LAI_OBS =と次の空白行の間のすべてのテキストを読み取る方法を見つける必要があります。

これまでのところ、私が使用しています:

l <- readLines('file.txt') 
which(obs.lai=='LAI_OBS =') 

を私は抽出する必要がブロックの最初の行を識別することができますが、私はLAI_OBS =後の最初の空白行に移動するにはRを指示する方法がわかりません。

私は必要な結果はこのように見て、データフレームです:

1991 182 0.00 
1991 194 0.028 
1991 202 0.185 
1991 211 0.325 
1991 219 1.048 
1991 240 3.680 
1991 254 5.010 
1991 260 4.628 
1991 273 3.520 
1991 288 1.938 

Rでこれを行うための便利な方法は何ですか?ありがとう。

答えて

3

を選択し、(==が場合にのために使用することができるように、それが固定でない場合、その後、grepがより有用であるに見えます。その後、nzcharで空白の要素のインデックスを取得「LAI_OBS」のインデックスを取得します。 「I1」よりも大きい最初の空のインデックスは、(調整は1を追加し、1を引いIE行った後)「I2」から「I1」からシーケンスを取得sub/gsubを使用して余分な文字を削除して読みread.csv

i1 <- grep("LAI_OBS =", l)+1 
i2 <- which(!nzchar(l)) 
i3 <- i2[i2>i1][1]-1  
read.csv(text=gsub("\\.,", ",", sub("\\s*,$", "", l[i1:i3])), header=FALSE) 
# V1 V2 V3 
#1 1991 182 0.000 
#2 1991 194 0.028 
#3 1991 202 0.185 
#4 1991 211 0.325 
#5 1991 219 1.048 
#6 1991 240 3.680 
#7 1991 254 5.010 
#8 1991 260 4.628 
#9 1991 273 3.520 
#10 1991 288 1.938 
+0

ありがとう@akrun、よこのコミュニティへの貢献は素晴らしいです! – thiagoveloso

2

私が集めたことから、あなたの入力ファイルについてのトリッキーな部分は、入力データがどこで終わるかを明確にすることができます。ファイルは、私が一致しようと20個の文字で始まる複数行を持っている場合、あなたは列の長さを増やす必要があるかもしれないこと

*-- Parameter to set forcing of observed LAI during simulation 

idx1 <- which(obs.lai=='LAI_OBS =') 
idx2 <- which(substring(obs.lai, 1, 20) == '*-- Parameter to set') 

df.keep <- obs.lai[idx1:idx2-1, ] 

注:時間と再びwhichを使用するには、次の行を一致させます。私の勘違いは、LAIシミュレーションを参照しているため、フルラインはユニークであるということです。

1

これはエレガントではなく、動作しますが、仕事を取得します。より多くのがある場合はもちろん、

[1] 18 [1] 29

l <- readLines('data.txt') 
first <- which(l=='LAI_OBS =') 
blanks <- which(l=='') 
whichblank <- which(which(l=='') > first) 
last <- blanks[whichblank] 
first 
last 

出力をあなたが最初に取得するファイルの空白行whichblank

関連する問題