2015-12-11 2 views
0

Je voudrais lire un fichier où chaque ligne représente un ensemble de données contenant la date, du texte et des nombres. Exemple:Comment lire un fichier avec un format spécifique en R?

Fri Dec 11 12:40:01 CET 2015 Uptime: 108491 Threads: 2 Questions: 576603 Slow queries: 10 Opens: 2238 Flush tables: 1 Open tables: 7 Queries per second avg: 5.314 
Fri Dec 11 12:50:01 CET 2015 Uptime: 109090 Threads: 2 Questions: 580407 Slow queries: 10 Opens: 2253 Flush tables: 1 Open tables: 6 Queries per second avg: 5.320 
Fri Dec 11 13:00:01 CET 2015 Uptime: 109690 Threads: 2 Questions: 583895 Slow queries: 10 Opens: 2268 Flush tables: 1 Open tables: 8 Queries per second avg: 5.323 
Fri Dec 11 13:10:01 CET 2015 Uptime: 110290 Threads: 1 Questions: 586891 Slow queries: 10 Opens: 2279 Flush tables: 1 Open tables: 6 Queries per second avg: 5.321 
Fri Dec 11 13:20:01 CET 2015 Uptime: 110890 Threads: 2 Questions: 590871 Slow queries: 10 Opens: 2292 Flush tables: 1 Open tables: 5 Queries per second avg: 5.328 

Il n'y a pas de caractère général de séparation (comme au format CSV), mais le format peut être décrit assez bien, puisque les onglets, charcters et texte peuvent être utilisés.

%DATESTRING%\tUptime: %uptime% Threads: %threads% Questions: %questions% Slow queries: %slow% Opens: %opens% Flush tables: %flush% Open tables: %otables% Queries per second avg: %qps% 

Y at-il une fonction qui prend la description du format et du fichier et remplit un data.frame avec les données données?

+0

J'ai eu de la chance de le lancer dans Excel, de le réparer là où il le faut, puis de l'enregistrer comme un csv. – TBSRounder

+0

@rawr le fait que les noms de colonne sont inclus dans les enregistrements de ligne est non-standard pour les largeurs fixes que j'ai travaillé avec ... – MichaelChirico

+0

@ MichaelChirico oui vous avez raison – rawr

Répondre

0

Les paquets tidyr ont quelques fonctions utilitaires qui peuvent être utiles pour cela, bien que je ne serais pas surpris s'il y avait plus d'outils spéciaux conçus pour ce travail.

Nous commençons par le chargement des données, dans ce cas, d'une chaîne

raw <- 'Fri Dec 11 12:40:01 CET 2015 Uptime: 108491 Threads: 2  Questions: 576603 Slow queries: 10 Opens: 2238 Flush tables: 1 Open tables: 7 Queries per second avg: 5.314 
Fri Dec 11 12:50:01 CET 2015 Uptime: 109090 Threads: 2 Questions: 580407 Slow queries: 10 Opens: 2253 Flush tables: 1 Open tables: 6 Queries per second avg: 5.320 
Fri Dec 11 13:00:01 CET 2015 Uptime: 109690 Threads: 2 Questions: 583895 Slow queries: 10 Opens: 2268 Flush tables: 1 Open tables: 8 Queries per second avg: 5.323 
Fri Dec 11 13:10:01 CET 2015 Uptime: 110290 Threads: 1 Questions: 586891 Slow queries: 10 Opens: 2279 Flush tables: 1 Open tables: 6 Queries per second avg: 5.321 
Fri Dec 11 13:20:01 CET 2015 Uptime: 110890 Threads: 2 Questions: 590871 Slow queries: 10 Opens: 2292 Flush tables: 1 Open tables: 5 Queries per second avg: 5.328' 

df <- read.csv(textConnection(raw), header=F) 

Ici, je l'ai utilisé read.csv pour que je sois comme une trame de données, mais vous pouvez aussi utiliser readLines et l'ajouter à un cadre vous-même.

Ensuite, nous traitons ce

library(tidyr) 
> processed <- df %>% extract(V1, 
    c("Date", "Uptime", "Threads", "Questions"), 
    "(.*) *Uptime: (\\d+) *Threads: (\\d+) *Questions: (\\d+)") 
> processed 
           Date Uptime Threads Questions 
1 Fri Dec 11 12:40:01 CET 2015  108491  2 576603 
2 Fri Dec 11 12:50:01 CET 2015  109090  2 580407 
3 Fri Dec 11 13:00:01 CET 2015  109690  2 583895 
4 Fri Dec 11 13:10:01 CET 2015  110290  1 586891 
5 Fri Dec 11 13:20:01 CET 2015  110890  2 590871 

Il devrait être clair comment extraire les colonnes restantes d'ici.

0

Deux autres options:

txt <- "Fri Dec 11 12:40:01 CET 2015 Uptime: 108491 Threads: 2 Questions: 576603 Slow queries: 10 Opens: 2238 Flush tables: 1 Open tables: 7 Queries per second avg: 5.314 
Fri Dec 11 12:50:01 CET 2015 Uptime: 109090 Threads: 2 Questions: 580407 Slow queries: 10 Opens: 2253 Flush tables: 1 Open tables: 6 Queries per second avg: 5.320 
Fri Dec 11 13:00:01 CET 2015 Uptime: 109690 Threads: 2 Questions: 583895 Slow queries: 10 Opens: 2268 Flush tables: 1 Open tables: 8 Queries per second avg: 5.323 
Fri Dec 11 13:10:01 CET 2015 Uptime: 110290 Threads: 1 Questions: 586891 Slow queries: 10 Opens: 2279 Flush tables: 1 Open tables: 6 Queries per second avg: 5.321 
Fri Dec 11 13:20:01 CET 2015 Uptime: 110890 Threads: 2 Questions: 590871 Slow queries: 10 Opens: 2292 Flush tables: 1 Open tables: 5 Queries per second avg: 5.328" 

## first just tack on the date label 
txt <- gsub('^', 'Date: ', readLines(textConnection(txt))) 

Option 1

sp <- strsplit(txt, '\\s{2,}') 
out <- lapply(sp, function(x) gsub('([\\w ]+:)\\s+(.*)$', '\\2', x, perl = TRUE)) 
dd <- setNames(do.call('rbind.data.frame', out), 
       gsub('([\\w ]+):\\s+(.*)$', '\\1', sp[[1]], perl = TRUE)) 
dd[, -1] <- lapply(dd[, -1], function(x) as.numeric(as.character(x))) 
dd 

option 2: Celui-ci utilise le paquet yaml mais est beaucoup plus vers l'avant droit et effectue la conversion de type pour vous

yml <- gsub('\\s{2,}', '\n', txt) 
do.call('rbind.data.frame', lapply(yml, yaml::yaml.load)) 

#     Date Uptime Threads Questions Slow queries Opens Flush tables 
# 1 Fri Dec 11 12:40:01 CET 2015 108491  2 576603   10 2238   1 
# 2 Fri Dec 11 12:50:01 CET 2015 109090  2 580407   10 2253   1 
# 3 Fri Dec 11 13:00:01 CET 2015 109690  2 583895   10 2268   1 
# 4 Fri Dec 11 13:10:01 CET 2015 110290  1 586891   10 2279   1 
# 5 Fri Dec 11 13:20:01 CET 2015 110890  2 590871   10 2292   1 
# Open tables Queries per second avg 
# 1   7     5.314 
# 2   6     5.320 
# 3   8     5.323 
# 4   6     5.321 
# 5   5     5.328