2017-02-01 6 views
1

У меня есть файл (Map_1.hdr) генерируют из инструмента, здесь файл:Импорт конкретные данные из TXT в R

ENVI 
    description = {ROI id #1} 
    samples = 16 
    lines = 4 
    bands = 1025 
    data type = 4 
    interleave = bip 
    wavelength = 
    pixel size = {9.38E-07, 7.5E-07} 
    x-start and y-start = {0.027363358, -0.007902135} 

И мне нужно, чтобы получить конкретные данные из последних 2-х строк, эти данные:

pixel_size = c(9.38E-07,7.5E-07) 
origin = (0.027363358, -0.007902135) 

Вот моя (неполная) попытка:

library(R.utils) 
rem <- 2 
nL <- countLines("Map_1.hdr") 
df <- read.csv("Map_1.hdr", header=FALSE, sep=" ", skip=nL-rem, stringsAsFactors = FALSE) 

с этим я получил две последние строки, но я до сих пор далеко, чтобы очистить повторно ул. Есть ли другой способ получить то, что я хочу?

ответ

1

Это то, что я использовал вместо этого:

txt <-" ENVI 
    description = {ROI id #1} 
    samples = 16 
    lines = 4 
    bands = 1025 
    data type = 4 
    interleave = bip 
    wavelength = 
    pixel size = {9.38E-07, 7.5E-07} 
    x-start and y-start = {0.027363358, -0.007902135}" 
rem <- 2 
nL <- length(readLines(textConnection(txt))) 
df <- read.delim(text=gsub(patt = "^.+\\{|\\}", 
           # ^^^^^^  removes everything upto last '{' 
            #  ^^^ as well as the trailing '}' 
            # ^ the `|` char is regex logical OR 
          repl = "", # by replacing with length zero character 
          readLines(textConnection(txt))), # input text or file 
        header=FALSE, sep=",", # left the comma in so it can be 'sep' 
        skip=nL-rem, stringsAsFactors = FALSE) 
> df 
      V1   V2 
1 0.000000938 0.000000750 
2 0.027363358 -0.007902135 

Вы можете заменить экземпляры readLines(textConnection(txt)) с именем файла и поместите текст = аргумент. (Полезно для построения рабочих, проверяемых примеров.)

+0

Отлично! Он работает, если я копирую и вставляю вашу попытку. К сожалению, я не могу понять (полностью), как мне изменить, чтобы получить общий код ... 'txt <-read.csv (" Map_1.hdr ") rem <- 2 nL <- length (readLines (textConnection (txt))) df <- read.delim (text = gsub ("^. + \\ {| \\}", "", readLines (textConnection (txt))), header = FALSE, sep = ",", skip = nL-rem, strAsAsFactors = FALSE) ' – Danilo

+1

Поясню некоторые комментарии« inline » –

+0

Если это сработает, вы можете отметить его, даже если вы не можете повышать. –

1

Может ли это работать? Не уверен, что если я полностью понимаю, что вывод, который вы хотите:

>attempt <- read.table("~/"Map_1.hdr"", sep= "=", stringsAsFactors = F) 

> tail(attempt,2)$ENVI 
[1] " {9.38E-07, 7.5E-07}"   " {0.027363358, -0.007902135}" 
> tail(attempt,2)$ENVI[1] 
[1] " {9.38E-07, 7.5E-07}" 
> tail(attempt,2)$ENVI[2] 
[1] " {0.027363358, -0.007902135}" 

Вы можете использовать strsplit и gsub, чтобы получить то, что вам нужно от там?

> strsplit(gsub('[\\{}]', "", tail(attempt,2)$ENVI[1]),",")[[1]][1] 
[1] " 9.38E-07" 
> strsplit(gsub('[\\{}]', "", tail(attempt,2)$ENVI[1]),",")[[1]][2] 
[1] " 7.5E-07" 
+0

Я пробовал, и он тоже работает. Благодарю. – Danilo