Как извлечь данные из текстового файла, используя R или PowerShell? - PullRequest
6 голосов
/ 24 января 2012

У меня есть текстовый файл, содержащий данные, подобные этим:

This is just text
-------------------------------
Username:          SOMETHI           C:                 [Text]
Account:           DFAG              Finish time:        1-JAN-2011 00:31:58.91
Process ID:        2028aaB           Start time:        31-DEC-2010 20:27:15.30

This is just text
-------------------------------
Username:          SOMEGG            C:                 [Text]
Account:           DFAG              Finish time:        1-JAN-2011 00:31:58.91
Process ID:        20dd33DB          Start time:        12-DEC-2010 20:27:15.30

This is just text
-------------------------------
Username:          SOMEYY            C:                 [Text]
Account:           DFAG              Finish time:        1-JAN-2011 00:31:58.91
Process ID:        202223DB          Start time:        15-DEC-2010 20:27:15.30

Есть ли способ извлечь имя пользователя, время окончания, время запуска из данных такого типа?Я ищу какую-то отправную точку, использующую R или Powershell.

Ответы [ 4 ]

8 голосов
/ 24 января 2012

R, возможно, не лучший инструмент для обработки текстовых файлов, но вы можете действовать следующим образом: идентифицировать два столбца, считав файл как файл фиксированной ширины, отделить поля от их значения, разделив строки на двоеточия, добавьте столбец «id» и верните все в порядок.

# Read the file
d <- read.fwf("A.txt", c(37,100), stringsAsFactors=FALSE)

# Separate fields and values
d <- d[grep(":", d$V1),]
d <- cbind( 
  do.call( rbind, strsplit(d$V1, ":\\s+") ), 
  do.call( rbind, strsplit(d$V2, ":\\s+") ) 
)

# Add an id column
d <- cbind( d, cumsum( d[,1] == "Username" ) )

# Stack the left and right parts
d <- rbind( d[,c(5,1,2)], d[,c(5,3,4)] )
colnames(d) <- c("id", "field", "value")
d <- as.data.frame(d)
d$value <- gsub("\\s+$", "", d$value)

# Convert to a wide data.frame
library(reshape2)
d <- dcast( d, id ~ field )
2 голосов
/ 24 января 2012

Вот решение Powershell:

$result = @()

get-content c:\somedir\somefile.txt |
foreach {
    if ($_ -match '^Username:\s+(\S+)'){
        $rec = ""|select UserName,FinishTime,StartTime
        $rec.UserName = $matches[1]
        }
    elseif ($_ -match '^Account.+Finish\stime:\s+(.+)'){
        $rec.FinishTime = $matches[1]
        }
    elseif ($_ -match '^Process\sID:\s+\S+\s+Start\stime:\s+(.+)'){
        $rec.StartTime = $matches[1]
        $result += $rec
        }
}
$result
2 голосов
/ 24 января 2012

Это всего лишь рекомендации о том, как бы я подошел к проблеме.Я уверен, что есть более причудливый способ сделать это.Возможно, включая Plyr.:)

rara <- readLines("test.txt") # you could use readLines(textConnection = "text"))

# find usernames
usn <- rara[grepl("Username:", rara)]
# you can find a fancy way to split or weed out spaces
# I crudely do it like this:
unlist(lapply(strsplit(usn, "      "), "[", 2)) # 2 means "extract the second element"

# and accounts
acc <- rara[grepl("Account:", rara)]
unlist(lapply(strsplit(acc, "      "), "[", 2))

Вы можете использовать str_trim() для удаления пробелов перед / после слова.Надеюсь, у вас будет достаточно указателей, чтобы вы смогли начать.

0 голосов
/ 24 января 2012

У вас есть файл в кадре данных? Как имена столбцов: имя пользователя, идентификатор процесса, время запуска ... Если это так, вы можете легко извлечь его с помощью

df$Username (where df is your data frame and if you want to see all your usernames)
df$FinishTime

Если вы хотите знать все о пользователе с определенным именем, используйте это

df[df$username == "SOMETHI",]

Если вы хотите знать пользователя с временем окончания ..

Надеюсь, что это может быть отправной точкой. Дайте мне знать, если что-то не ясно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...