Как извлечь данные из текстового файла, используя R или PowerShell?
У меня есть текстовый файл, содержащий такие данные:
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
Есть ли способ извлечь имя пользователя, время окончания, время начала из этого вида данных? Я ищу какую-то отправную точку usign R или Powershell.
4 ответа
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 )
Вот решение 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
Это всего лишь руководство, как я бы подошел к проблеме. Я уверен, что есть более причудливый способ сделать это. Возможно, включая 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()
удалить пробел до / после слова. Надеюсь, что достаточно указателей, чтобы вы пошли.
У вас есть файл в кадре данных? Как имена столбцов будут Имя пользователя, Идентификатор процесса, Время начала... Если это так, вы можете легко извлечь его с помощью
df$Username (where df is your data frame and if you want to see all your usernames)
df$FinishTime
Если вы хотите знать все о пользователе с определенным именем, используйте это
df[df$username == "SOMETHI",]
Если вы хотите узнать пользователя с окончанием времени..
Надеюсь, что это может быть отправной точкой. Дайте мне знать, если что-то не ясно.