2012-01-24 16 views
6

Tengo un archivo de texto que contiene los datos de la siguiente manera:¿Cómo extraer datos de un archivo de texto usando R o 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 

¿Hay una manera de extraer el tiempo nombre de usuario, acabado, Hora de inicio de este tipo de datos? Estoy buscando un punto de partida para usar R o Powershell.

Respuesta

8

R puede no ser la mejor herramienta para procesar archivos de texto, pero puede proceder de la siguiente manera: identifique las dos columnas leyendo el archivo como un archivo de ancho fijo, separe los campos de su valor dividiendo las cadenas en el dos puntos, agregue una columna "id" y vuelva a poner todo en orden.

# 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) 
+0

¡Gracias, funciona como el encanto! – jrara

+0

¿Cuál sería su herramienta para trabajar con archivos de texto? Perl, Ruby tal vez? –

+1

@ RomanLuštrik: Yo personalmente usaría Perl, porque estoy familiarizado con él, pero Python o Ruby deberían probar soluciones igualmente buenas. Normalmente prefiero hacer todo el preprocesamiento por separado, de modo que R solo tiene que leer archivos o tablas csv en una base de datos. –

0

¿Tiene su archivo en un marco de datos? Al igual que los nombres de las columnas serían nombre de usuario, ID de proceso, Hora de inicio ... Si es así, puede easly extraerlo por

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

Si desea saber todo acerca de un usuario con un nombre determinado, utilice este

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

Si quieres saber un usuario con un tiempo en meta ..

Hope esto puede ser un punto de partida. Avíseme si algo no está claro.

+0

Creo que está tratando de extraer los datos para que pueda ponerlo en un hoja.de.datos. –

2

Estas son solo pautas sobre cómo abordaría el problema. Estoy seguro de que hay una manera más elegante de hacerlo. Posiblemente incluye 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)) 

Puede utilizar str_trim() para eliminar los espacios en blanco antes/después de la palabra. Espero que haya suficientes consejos para que empieces.

2

he aquí una solución 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 
Cuestiones relacionadas