1

大量のデータとテキストを含むファイルがあります。3つの座標を持つ行のみを保持するようにファイルを読みたい. 3 つの座標は、次のような形式の行を参照します490353.36, 3755632.81, 109.73。つまり、面線後のデータを保持したいのです。データには、異なる断面での x、y、および z 座標があります。

サンプル データは次のとおりです。

ENDSTREAMNETWORK:

BEGIN CROSS-SECTIONS:

  CROSS-SECTION:
    STREAM ID:Sipsey Fork     
    REACH ID:Sipsey Fork     
    STATION:13.60   
    NODE NAME:                
    CUT LINE:
      490353.358391478 , 3755632.80772044 
      490254.511677942 , 3755640.28160111 
      490229.8 , 3755642.15 
      490205.088314326 , 3755644.01839947 
      490130.953109393 , 3755649.62143546 
    SURFACE LINE:
     490353.36,   3755632.81,   109.73
     490341.00,   3755633.74,   103.63
     490331.74,   3755634.44,   97.54
     490276.13,   3755638.65,   91.44
     490263.78,   3755639.58,   85.34
     490254.51,   3755640.28,   79.25
     490254.51,   3755640.28,   79.25
     490242.16,   3755641.22,   75.59
     490229.80,   3755642.15,   75.59
     490217.44,   3755643.08,   75.59
     490205.09,   3755644.02,   79.25
     490205.09,   3755644.02,   79.25
     490186.55,   3755645.42,   85.34
     490177.29,   3755646.12,   91.44
     490158.75,   3755647.52,   97.54
     490146.40,   3755648.45,   103.63
     490130.95,   3755649.62,   109.73
  END:

  CROSS-SECTION:
    STREAM ID:Sipsey Fork     
    REACH ID:Sipsey Fork     
    STATION:13.552* 
    NODE NAME:                
    CUT LINE:
      490348.236792825 , 3755554.44864345 
      490248.581497463 , 3755561.99219479 
      490223.87626427 , 3755563.8637565 
      490199.171038808 , 3755565.73531763 
      490122.732478269 , 3755571.5258566 
    SURFACE LINE:
     490348.24,   3755554.45,   109.73
     490335.78,   3755555.39,   103.68
     490332.73,   3755555.62,   101.72
     490326.44,   3755556.10,   97.65
     490321.09,   3755556.50,   96.98
     490279.74,   3755559.63,   92.42
     490270.38,   3755560.34,   91.35
     490262.42,   3755560.94,   87.53
     490258.64,   3755561.23,   85.56
     490257.92,   3755561.29,   85.22
     490253.65,   3755561.61,   82.50
     490248.58,   3755561.99,   79.27
     490248.58,   3755561.99,   79.27
     490245.75,   3755562.21,   78.40
     490243.64,   3755562.37,   77.73
     490236.08,   3755562.94,   75.58
     490223.88,   3755563.86,   75.58
     490212.36,   3755564.74,   75.58
     490209.15,   3755564.98,   76.44
     490206.21,   3755565.20,   77.24
     490200.50,   3755565.63,   78.84
     490199.17,   3755565.74,   79.26
     490199.17,   3755565.74,   79.26
     490197.66,   3755565.85,   79.78
     490193.00,   3755566.20,   81.22
     490186.72,   3755566.68,   83.20
     490182.06,   3755567.03,   84.83
     490180.06,   3755567.18,   85.47
     490170.51,   3755567.91,   91.44
     490170.23,   3755567.93,   91.52
     490151.40,   3755569.35,   97.45
     490141.55,   3755570.10,   102.06
     490138.66,   3755570.32,   103.48
     490133.49,   3755570.71,   105.53
     490122.73,   3755571.53,   109.73
  END:

上記のように何千もの行があります。コンマで区切られた3つの列ですべてのデータをコンパイルし、これをRのデータフレームとして保存したいだけです.

上記のデータセットに必要なサンプル出力は次のとおりです。コンマも削除する必要があります

     490353.36,   3755632.81,   109.73
     490341.00,   3755633.74,   103.63
     490331.74,   3755634.44,   97.54
     490276.13,   3755638.65,   91.44
     490263.78,   3755639.58,   85.34
     490254.51,   3755640.28,   79.25
     490254.51,   3755640.28,   79.25
     490242.16,   3755641.22,   75.59
     490229.80,   3755642.15,   75.59
     490217.44,   3755643.08,   75.59
     490205.09,   3755644.02,   79.25
     490205.09,   3755644.02,   79.25
     490186.55,   3755645.42,   85.34
     490177.29,   3755646.12,   91.44
     490158.75,   3755647.52,   97.54
     490146.40,   3755648.45,   103.63
     490130.95,   3755649.62,   109.73
     490348.24,   3755554.45,   109.73
     490335.78,   3755555.39,   103.68
     490332.73,   3755555.62,   101.72
     490326.44,   3755556.10,   97.65
     490321.09,   3755556.50,   96.98
     490279.74,   3755559.63,   92.42
     490270.38,   3755560.34,   91.35
     490262.42,   3755560.94,   87.53
     490258.64,   3755561.23,   85.56
     490257.92,   3755561.29,   85.22
     490253.65,   3755561.61,   82.50
     490248.58,   3755561.99,   79.27
     490248.58,   3755561.99,   79.27
     490245.75,   3755562.21,   78.40
     490243.64,   3755562.37,   77.73
     490236.08,   3755562.94,   75.58
     490223.88,   3755563.86,   75.58
     490212.36,   3755564.74,   75.58
     490209.15,   3755564.98,   76.44
     490206.21,   3755565.20,   77.24
     490200.50,   3755565.63,   78.84
     490199.17,   3755565.74,   79.26
     490199.17,   3755565.74,   79.26
     490197.66,   3755565.85,   79.78
     490193.00,   3755566.20,   81.22
     490186.72,   3755566.68,   83.20
     490182.06,   3755567.03,   84.83
     490180.06,   3755567.18,   85.47
     490170.51,   3755567.91,   91.44
     490170.23,   3755567.93,   91.52
     490151.40,   3755569.35,   97.45
     490141.55,   3755570.10,   102.06
     490138.66,   3755570.32,   103.48
     490133.49,   3755570.71,   105.53
     490122.73,   3755571.53,   109.73
4

4 に答える 4

3

最初にテキストファイルを次のように読み取ることで、次のようなことを行いますreadLines

tt <- readLines("myfile.txt")
pat <- "^[ ]*(.*),(.*),(.*)[ ]*$"
tt <- gsub(pat, "\\1,\\2,\\3", grep(pat, tt, value=TRUE))
dat <- read.table(textConnection(tt), sep=",", header=FALSE)

アイデア: 最初にファイル全体を読み込み、tt必要なすべての変更を行ったり、必要な行をフィルタリングしたりできるようにします。次に、保持する行と破棄する行を選択する必要があります。そのために、パターン0-任意の量のスペースの後に何かが続き、,その後に何かが続き、その後に何かが続き、,その後に任意の量のスペースが続きます。これにより、 で区切られた 3 つの列を持つ行だけが取得され,ます。したがって、最初にこれを使用patgrepてこれらの行をフィルタリングし、パターンに一致する行のみを保持します ( を使用value=TRUE)。次にgsub、空白を削除し、その間にあるものだけを保持するために使用します,s(絶対に必要ではないと思いますが、確かに害はありません)。これで、必要なデータが得られました。私たちがしなければならないことは、それを に渡して、通常どおりにtextConnection使用して読み取ることだけです。read.tableお役に立てれば。

線はすでにバラバラになっています。これらの行を 1 行ずつ入力して出力を見るだけで、すぐに理解できるはずです。

于 2013-07-03T21:24:12.427 に答える
3

これはとても醜いので、ほとんど投稿することさえありませんでした。しかし、それは機能します。私はあなたのデータを次のように読みました:

raw<-read.table(textConnection('NDSTREAMNETWORK:

BEGIN CROSS-SECTIONS:

  CROSS-SECTION:
    STREAM ID:Sipsey Fork     
    REACH ID:Sipsey Fork     
    STATION:13.60   
    NODE NAME:                
    CUT LINE:
      490353.358391478 , 3755632.80772044 
      490254.511677942 , 3755640.28160111 
      490229.8 , 3755642.15 
      490205.088314326 , 3755644.01839947 
      490130.953109393 , 3755649.62143546 
    SURFACE LINE:
     490353.36,   3755632.81,   109.73
     490341.00,   3755633.74,   103.63
     490331.74,   3755634.44,   97.54
     490276.13,   3755638.65,   91.44
     490263.78,   3755639.58,   85.34
     490254.51,   3755640.28,   79.25
     490254.51,   3755640.28,   79.25
     490242.16,   3755641.22,   75.59
     490229.80,   3755642.15,   75.59
     490217.44,   3755643.08,   75.59
     490205.09,   3755644.02,   79.25
     490205.09,   3755644.02,   79.25
     490186.55,   3755645.42,   85.34
     490177.29,   3755646.12,   91.44
     490158.75,   3755647.52,   97.54
     490146.40,   3755648.45,   103.63
     490130.95,   3755649.62,   109.73
  END:

  CROSS-SECTION:
    STREAM ID:Sipsey Fork     
    REACH ID:Sipsey Fork     
    STATION:13.552* 
    NODE NAME:                
    CUT LINE:
      490348.236792825 , 3755554.44864345 
      490248.581497463 , 3755561.99219479 
      490223.87626427 , 3755563.8637565 
      490199.171038808 , 3755565.73531763 
      490122.732478269 , 3755571.5258566 
    SURFACE LINE:
     490348.24,   3755554.45,   109.73
     490335.78,   3755555.39,   103.68
     490332.73,   3755555.62,   101.72
     490326.44,   3755556.10,   97.65
     490321.09,   3755556.50,   96.98
     490279.74,   3755559.63,   92.42
     490270.38,   3755560.34,   91.35
     490262.42,   3755560.94,   87.53
     490258.64,   3755561.23,   85.56
     490257.92,   3755561.29,   85.22
     490253.65,   3755561.61,   82.50
     490248.58,   3755561.99,   79.27
     490248.58,   3755561.99,   79.27
     490245.75,   3755562.21,   78.40
     490243.64,   3755562.37,   77.73
     490236.08,   3755562.94,   75.58
     490223.88,   3755563.86,   75.58
     490212.36,   3755564.74,   75.58
     490209.15,   3755564.98,   76.44
     490206.21,   3755565.20,   77.24
     490200.50,   3755565.63,   78.84
     490199.17,   3755565.74,   79.26
     490199.17,   3755565.74,   79.26
     490197.66,   3755565.85,   79.78
     490193.00,   3755566.20,   81.22
     490186.72,   3755566.68,   83.20
     490182.06,   3755567.03,   84.83
     490180.06,   3755567.18,   85.47
     490170.51,   3755567.91,   91.44
     490170.23,   3755567.93,   91.52
     490151.40,   3755569.35,   97.45
     490141.55,   3755570.10,   102.06
     490138.66,   3755570.32,   103.48
     490133.49,   3755570.71,   105.53
     490122.73,   3755571.53,   109.73
  END:'),sep='\n',stringsAsFactors=FALSE)

それから私はそれをdata.frame

vec<-unlist(raw)

start<-grep('SURFACE LINE:',vec)+1
end<-grep('END:',vec)-1

data<-do.call(rbind,
lapply(seq_along(start), 
  function(x) read.table(textConnection(vec[start[x]:end[x]])))
)
于 2013-07-03T21:24:22.943 に答える
2

最短ではありませんが、私にとってはより理解しやすいです

raw_text <- "ENDSTREAMNETWORK:

BEGIN CROSS-SECTIONS:

  CROSS-SECTION:
    STREAM ID:Sipsey Fork     
    REACH ID:Sipsey Fork     
    STATION:13.60   
    NODE NAME:                
    CUT LINE:
      490353.358391478 , 3755632.80772044 
      490254.511677942 , 3755640.28160111 
      490229.8 , 3755642.15 
      490205.088314326 , 3755644.01839947 
      490130.953109393 , 3755649.62143546 
    SURFACE LINE:
     490353.36,   3755632.81,   109.73
     490341.00,   3755633.74,   103.63
     490331.74,   3755634.44,   97.54
     490276.13,   3755638.65,   91.44
     490263.78,   3755639.58,   85.34
     490254.51,   3755640.28,   79.25
     490254.51,   3755640.28,   79.25
     490242.16,   3755641.22,   75.59
     490229.80,   3755642.15,   75.59
     490217.44,   3755643.08,   75.59
     490205.09,   3755644.02,   79.25
     490205.09,   3755644.02,   79.25
     490186.55,   3755645.42,   85.34
     490177.29,   3755646.12,   91.44
     490158.75,   3755647.52,   97.54
     490146.40,   3755648.45,   103.63
     490130.95,   3755649.62,   109.73
  END:"

手順は次のとおりです

## read the data
raw_data <- readLines(textConnection(raw_text))

## split by ","
split_list <- strsplit(raw_data, ",")

## check for 3 columns
data <- split_list[sapply(split_list, length) == 3]

## remove space and ","
data <- lapply(data, function(x) gsub("\\s+|\\,", "", x))

## bind the data 
do.call("rbind", data)


##       [,1]        [,2]         [,3]    
##  [1,] "490353.36" "3755632.81" "109.73"
##  [2,] "490341.00" "3755633.74" "103.63"
##  [3,] "490331.74" "3755634.44" "97.54" 
##  [4,] "490276.13" "3755638.65" "91.44" 
##  [5,] "490263.78" "3755639.58" "85.34" 
##  [6,] "490254.51" "3755640.28" "79.25" 
##  [7,] "490254.51" "3755640.28" "79.25" 
##  [8,] "490242.16" "3755641.22" "75.59" 
##  [9,] "490229.80" "3755642.15" "75.59" 
## [10,] "490217.44" "3755643.08" "75.59" 
## [11,] "490205.09" "3755644.02" "79.25" 
## [12,] "490205.09" "3755644.02" "79.25" 
## [13,] "490186.55" "3755645.42" "85.34" 
## [14,] "490177.29" "3755646.12" "91.44" 
## [15,] "490158.75" "3755647.52" "97.54" 
## [16,] "490146.40" "3755648.45" "103.63"
## [17,] "490130.95" "3755649.62" "109.73"
于 2013-07-03T21:27:17.790 に答える