读取不以dos开头的行

时间:2017-04-07 06:05:29

标签: r

我必须导入一个包含数千行的csv文件。在此文件中,标题会多次出现。此标头以以下四个字符开头:]dos。我想读一行,不包括以]dos开头的行。

该文件看起来像

N[ dos  Date dos    Heure Dos   Nom du patient  ex pat
N[ dos  Date dos    Heure Dos   Nom du patient  ex pat
7061283778  02-03-17    12h54   Mr MONTALDO JIMENA          02-03-17
7061283777  02-03-17    12h54   Mme MONTALDO JIMENA             03-03-17
7061283790  02-03-17    12h54   Mme MONTALDO JIMENA             02-03-17
7061283779  02-03-17    12h55   Mr MONTALDO JIMENA              02-03-17
7061300309  02-03-17    12h55   Mme MONTALDO JIMENA             02-03-17
7061294068  02-03-17    12h56   Mme MONTALDO JIMENA             03-03-17
7061283782  02-03-17    12h56   Mr MONTALDO JIMENA              02-03-17
N[ dos  Date dos    Heure Dos   Nom du patient  ex pat
7061283781  02-03-17    12h56   Mlle MONTALDO JIMENA            02-03-17
7061300311  02-03-17    12h57   Mme MONTALDO JIMENA             02-03-17

正如您所见,标题出现了三次。

我是@Jaap发布的方法,但我认为该文件非常脏,从某种意义上说:

  • 它是一个csv文件,但带有分隔符;而不是,(因为它是法国人)。
  • 有几列有空值。
  • 也许甚至还有未知的角色(不确定)。

我收到以下错误消息:

  

df< - read.table(text = txt,header = FALSE)   扫描错误(file = file,what = what,sep = sep,quote = quote,dec = dec,:     第1行没有44个元素   另外:警告信息:   关闭未使用的连接3(extraction.csv)

我必须在R中准备一个程序,供那些对编程或数据分析一无所知的人使用。此人将定期使用该程序,以便从数据中获得一些结果。此人将无法自行清理该数据。

如果您使用Excel打开文件,这就是文件的样子:

how the file looks like if you open it with Excel

1 个答案:

答案 0 :(得分:5)

根据示例数据,我想您要排除以N[ dos开头的行。

您可以通过几个步骤在数据框中获取此数据:

  1. 使用readLines读取数据文件。 (因为我没有文件,我使用了textConnection;但你可以按照以下方式使用它:readLines('name_of_your_file.txt')来阅读文字)
  2. 使用N[ dos - 功能删除以grepl开头的行。
  3. 使用read.table
  4. 阅读剩余的文字

    完整代码:

    txtcon <- textConnection('N[ dos  Date dos    Heure Dos   Nom du patient  ex pat
    N[ dos  Date dos    Heure Dos   Nom du patient  ex pat
    7061283778  02-03-17    12h54   Mr MONTALDO JIMENA          02-03-17
    7061283777  02-03-17    12h54   Mme MONTALDO JIMENA             03-03-17
    7061283790  02-03-17    12h54   Mme MONTALDO JIMENA             02-03-17
    7061283779  02-03-17    12h55   Mr MONTALDO JIMENA              02-03-17
    7061300309  02-03-17    12h55   Mme MONTALDO JIMENA             02-03-17
    7061294068  02-03-17    12h56   Mme MONTALDO JIMENA             03-03-17
    7061283782  02-03-17    12h56   Mr MONTALDO JIMENA              02-03-17
    N[ dos  Date dos    Heure Dos   Nom du patient  ex pat
    7061283781  02-03-17    12h56   Mlle MONTALDO JIMENA            02-03-17
    7061300311  02-03-17    12h57   Mme MONTALDO JIMENA             02-03-17')
    
    txt <- readLines(txtcon)
    
    txt <- txt[!grepl(pattern = '^N\\[ dos', txt)]
    
    df <- read.table(text = txt, header = FALSE)
    

    这导致以下数据帧:

    > df
              V1       V2    V3   V4       V5     V6       V7
    1 7061283778 02-03-17 12h54   Mr MONTALDO JIMENA 02-03-17
    2 7061283777 02-03-17 12h54  Mme MONTALDO JIMENA 03-03-17
    3 7061283790 02-03-17 12h54  Mme MONTALDO JIMENA 02-03-17
    4 7061283779 02-03-17 12h55   Mr MONTALDO JIMENA 02-03-17
    5 7061300309 02-03-17 12h55  Mme MONTALDO JIMENA 02-03-17
    6 7061294068 02-03-17 12h56  Mme MONTALDO JIMENA 03-03-17
    7 7061283782 02-03-17 12h56   Mr MONTALDO JIMENA 02-03-17
    8 7061283781 02-03-17 12h56 Mlle MONTALDO JIMENA 02-03-17
    9 7061300311 02-03-17 12h57  Mme MONTALDO JIMENA 02-03-17
    

    查看结果数据框,我想您希望将一些列放在一列中。可能的方法可能是:

    df2 <- data.frame(id = df$V1, 
                      datetime1 = strptime(paste(df$V2, df$V3), '%d-%m-%y %Hh%M'),
                      datetime2 = as.Date(df$V7, '%d-%m-%y'),
                      name = paste(df$V4, df$V5, df$V6))
    

    导致:

    > df2
              id           datetime1  datetime2                 name
    1 7061283778 2017-03-02 12:54:00 2017-03-02   Mr MONTALDO JIMENA
    2 7061283777 2017-03-02 12:54:00 2017-03-03  Mme MONTALDO JIMENA
    3 7061283790 2017-03-02 12:54:00 2017-03-02  Mme MONTALDO JIMENA
    4 7061283779 2017-03-02 12:55:00 2017-03-02   Mr MONTALDO JIMENA
    5 7061300309 2017-03-02 12:55:00 2017-03-02  Mme MONTALDO JIMENA
    6 7061294068 2017-03-02 12:56:00 2017-03-03  Mme MONTALDO JIMENA
    7 7061283782 2017-03-02 12:56:00 2017-03-02   Mr MONTALDO JIMENA
    8 7061283781 2017-03-02 12:56:00 2017-03-02 Mlle MONTALDO JIMENA
    9 7061300311 2017-03-02 12:57:00 2017-03-02  Mme MONTALDO JIMENA