2017-04-15 1 views
1

J'ai un fichier txt qui a ce format:fichier texte lu dans r et stocker ce qui est lu conditionnée à la ligne suivante

-------------------------------------------------------------------------------------------------------------- 
m5a2              A2. Confirm how much time child lives with respondent 
-------------------------------------------------------------------------------------------------------------- 

        type: numeric (byte) 
       label: BM_101F 

       range: [-9,7]      units: 1 
     unique values: 8      missing .: 0/4898 

      tabulation: Freq. Numeric Label 
          1383  -9 -9 Not in wave 
          4  -2 -2 Don't know 
          2  -1 -1 Refuse 
          3272   1 1 all or most of the time 
          29   2 2 about half of the time 
          76   3 3 some of the time 
          80   4 4 none of the time 
          52   7 7 only on weekends 

-------------------------------------------------------------------------------------------------------------- 
m5a3             A3. Number of months ago child stopped living with you 
-------------------------------------------------------------------------------------------------------------- 

        type: numeric (int) 
       label: NUMERIC, but 44 nonmissing values are not labeled 

       range: [-9,120]      units: 1 
     unique values: 47      missing .: 0/4898 

       examples: -9 -9 Not in wave 
         -6 -6 Skip 
         -6 -6 Skip 
         -6 -6 Skip 

-------------------------------------------------------------------------------------------------------------- 

Ce qui est important pour moi, est le nom de code tels que m5a2, la Description A2. Confirm how much time child lives with respondent, et enfin, les valeurs des réponses

tabulation: Freq. Numeric Label 
          1383  -9 -9 Not in wave 
          4  -2 -2 Don't know 
          2  -1 -1 Refuse 
          3272   1 1 all or most of the time 
          29   2 2 about half of the time 
          76   3 3 some of the time 
          80   4 4 none of the time 
          52   7 7 only on weekends 

Je dois lire les trois éléments dans une liste pour un traitement ultérieur.

J'ai essayé ce qui suit, et cela fonctionne pour récupérer le nom de code et la description.

fileName <- "../data/ff_mom_cb9.txt" 
conn <- file(fileName,open="r") 
linn <-readLines(conn) 
L = list() 
for (i in 1:length(linn)){ 
    if((linn[i]=="--------------------------------------------------------------------------------------------------------------") & (linn[i+1]!="")) 
    { 
    L[i] = linn[i+1] 
    } 

    else 
    { 
    # read until hit the next dashed line 
    } 
} 
close(conn) 

Quelques choses que je suis confus au sujet de: 1. Je ne sais pas comment le laisser lire la ligne jusqu'à ce qu'il touche le suivant la ligne suivante en pointillés. 2. Mon approche est-elle correcte pour stocker les données lues dans une liste si je veux être capable de visualiser la recherche, et récupérer facilement les données?

Merci.

Répondre

0

Ce sera un peu problématique car le format est tellement irrégulier d'un article à l'autre. Heres une course au premier texte de l'article codebook:

txt <- "m5a2              A2. Confirm how much time child lives with respondent 
-------------------------------------------------------------------------------------------------------------- 

        type: numeric (byte) 
       label: BM_101F 

       range: [-9,7]      units: 1 
     unique values: 8      missing .: 0/4898 

      tabulation: Freq. Numeric Label 
          1383  -9 -9 Not in wave 
          4  -2 -2 Don't know 
          2  -1 -1 Refuse 
          3272   1 1 all or most of the time 
          29   2 2 about half of the time 
          76   3 3 some of the time 
          80   4 4 none of the time 
          52   7 7 only on weekends 
" 
Lines <- readLines(textConnection(txt)) 
# isolate lines with letter in first column 
Lines[grep("^[a-zA-Z]", Lines)] 
# Now replace long runs of spaces with commas and scan: 

scan(text=sub("[ ]{10,100}", ",", Lines[grep("^[a-zA-Z]", Lines)]), 
    sep=",", what="") 
#---- 
Read 2 items 
[1] "m5a2"             
[2] "A2. Confirm how much time child lives with respondent" 

La ligne « tabulation » peut être utilisé pour créer des étiquettes de colonne.

colnames <- scan(text=sub(".*tabulation[:]", "", 
        Lines[grep("tabulation[:]", Lines)]), sep="", what="") 
#Read 3 items 

La stratégie de substitution par virgule doit être un peu plus impliquée pour les lignes par la suite. Tout d'abord isoler les lignes où un chiffre numérique est le premier caractère non-espace:

dataRows <- Lines[grep("^[ ]*\\d", Lines)] 

virgules pour remplacer ensuite le chiffre-2 + modèle espaces et lire avec read.csv:

myDat <- read.csv(text= 
         gsub("(\\d)[ ]{2,}", "\\1,", dataRows), 
        header=FALSE ,col.names=colnames) 

#------------ 
myDat 
    V1 V2      V3 
1 1383 -9   -9 Not in wave 
2 4 -2    -2 Don't know 
3 2 -1     -1 Refuse 
4 3272 1 1 all or most of the time 
5 29 2 2 about half of the time 
6 76 3  3 some of the time 
7 80 4  4 none of the time 
8 52 7  7 only on weekends 

bouclez plusieurs éléments peuvent être possibles avec un compteur généré à partir cumsum(grepl("^-------", Lines) si les lignes objet était le fichier entier tel que celui à:

Lines <- readLines("http://fragilefamilies.princeton.edu/sites/fragilefamilies/files/ff_mom_cb9.txt") 
sum(grepl("^-------", Lines)) 
#---------------------- 
[1] 1966 
Warning messages: 
1: In grepl("^-------", Lines) : 
    input string 6995 is invalid in this locale 
2: In grepl("^-------", Lines) : 
    input string 7349 is invalid in this locale 
3: In grepl("^-------", Lines) : 
    input string 7350 is invalid in this locale 
4: In grepl("^-------", Lines) : 
    input string 7352 is invalid in this locale 
5: In grepl("^-------", Lines) : 
    input string 7353 is invalid in this locale 

Mon « scan main() - er » SUG Pour moi, il n'y avait que deux types d'enregistrements de livres de codes: les "tabulations" (vraisemblablement les objets ayant moins d'une dizaine d'intances) et les "exemples" (ceux avec plus). Ils avaient des structures différentes (comme on peut le voir plus haut dans votre fragment de livre de codes) alors peut-être que seulement deux types de logique d'analyse seraient nécessaires pour être construits et déployés. Donc, je pense que les outils pour le faire sont décrits ci-dessus. Les avertissements se rapportent tous au caractère "\ x92" utilisé comme apostrophe. Regex et R partagent un caractère d'échappement "\", vous devez donc échapper aux échappements. Ils pourraient être corrigés avec:

Lines <- gsub("\\\x92", "'", Lines) 
-1

Que pensez-vous de cela?

df <- read.table("file.txt", 
      header = FALSE) 
df 
+0

Il semble lire une ligne à la fois en 'd'? – Waht

+0

que faire si vous essayez ceci? –

+0

ou si vous avez des en-têtes, il suffit de le remplacer par TRUE au lieu de FALSE –