【问题标题】:Importing .txt file in R在 R 中导入 .txt 文件
【发布时间】:2020-07-23 11:54:31
【问题描述】:

我要导入具有以下模式的 txt 文件:

"X1"\"ID_T35.x"\"Produktionsdatum.x"\"Herstellernummer.x"\"Werksnummer.x"\"Fehlerhaft.x"\"Fehlerhaft_Datum.x"\"Fehlerhaft_Fahrleistung.x"\"ID_T35.y"\"Produktionsdatum.y"\"Herstellernummer.y"\"Werksnummer.y"\"Fehlerhaft.y"\"Fehlerhaft_Datum.y"\"Fehlerhaft_Fahrleistung.y""1"\2\"35-217-2173-92"\2008-11-07\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"2"\9\"35-217-2173-23"\2008-11-07\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"3"\10\"35-217-2173-24"\2008-11-07\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"4"\11\"35-217-2173-52"\2008-11-07\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"5"\12\"35-217-2173-104"\2008-11-07\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"6"\19\"35-217-2173-50"\2008-11-07\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"7"\20\"35-217-2173-93"\2008-11-07\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"8"\21\"35-217-2173-111"\2008-11-07\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"9"\22\"35-217-2173-113"\2008-11-07\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"10"\23\"35-217-2173-138"\2008-11-07\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"11"\24\"35-217-2173-150"\2008-11-07\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"12"\25\"35-217-2173-158"\2008-11-07\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"13"\33\"35-217-2173-8"\2008-11-07\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"14"\34\"35-217-2173-43"\2008-11-07\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"15"\35\"35-217-2173-79"\2008-11-07\"217"\2173\1\2010-04-28\41562.3534246575\NA\NA\NA\NA\NA\NA\NA"16"\36\"35-217-2173-102"\2008-11-07\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"17"\37\"35-217-2173-117"\2008-11-07\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"18"\38\"35-217-2173-139"\2008-11-07\"217"\2173\1\2010-04-28\41562.3534246575\NA\NA\NA\NA\NA\NA\NA"19"\40\"35-217-2173-55"\2008-11-07\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"20"\41\"35-217-2173-182"\2008-11-08\"217"\2173\1\2010-04-29\41648.7616438356\NA\NA\NA\NA\NA\NA\NA"21"\42\"35-217-2173-212"\2008-11-08\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"22"\43\"35-217-2173-227"\2008-11-08\"217"\2173\1\2010-04-29\41648.7616438356\NA\NA\NA\NA\NA\NA\NA"23"\44\"35-217-2173-283"\2008-11-08\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"24"\49\"35-217-2173-41"\2008-11-07\"217"\2173\0\NA\0\NA\NA\NA\NA\NA\NA\NA"25"

反斜杠表示一个新列,直到字符串“1”。那应该是一个新行。数据集应该有 818844 行。该数据集称为 Einzelteil_T35。我的方法是这样的:

library(readr)
library(data.table)
library(tidyverse)

Einzelteil_T35 <- read_file("Einzelteil_T35.txt") %>%
  str_replace_all(. , "\"\"", ";") %>%
  str_replace_all(. ,"____", "\n" ) %>%    #"_____" means i haven't find a pattern to identify the new row
  fread(text = .) %>%
  as_tibble()

我一直在考虑一种计算反斜杠的方法,并在每次找到第 15 个反斜杠时创建一个新行,因为第 15 个反斜杠是新行的开始,但我没有找到方法。也许你可以用这种方法或完全不同的方法帮助我。

非常感谢您

【问题讨论】:

    标签: r import


    【解决方案1】:

    此代码读取文件,将其转换为 Nx15 矩阵,从最后一列中删除行号,将第一行用作标题,然后将其转换为 data.frame。

    唯一剩下的问题是转换为矩阵将所有单元格内容转换为字符。您必须手动将列转换回数字。

    data = paste(scan("data_line.txt",what="character"),collapse='') ## Read the file
    dmat = matrix(strsplit(data,"\\\\")[[1]],ncol=15,byrow=T) ## Convert it to a matrix
    dmat[,15] = gsub("\".*[0-9]\"","",dmat[,15]) ## Remove the next line number from the values of the last column
    colnames(dmat)=dmat[1,] ## Take first line as names
    dmat = dmat[-1,] ## Remove first line (as it contained the names)
    df = as.data.frame(dmat)
    

    编辑:修正正则表达式。

    【讨论】:

    • 非常感谢您的快速回复!但是有一个问题:如果观察结果为 NA,则不会删除最后一列中的下一行编号。它适用于前 8 行。但之后的观察结果如下所示:NA"1, NA"2, NA"3 ... 因为我对 R 很陌生,所以我不太了解你的第三行是如何工作的:你正在重新定义 dmat[,15]使用 gsub 但还将 dmat[,15] 设置为 gsub 中的数据。我不明白那里发生了什么。也许你可以帮助我理解那部分?(查看 gsub 文档没有帮助)谢谢提前很多。
    • 这一行的作用是搜索正则表达式模式:"numbers"。当它在引号中找到这种数字模式时,会将它们替换为空字符串 (")。它在第 15 列的所有单元格中执行此操作。它应该工作。但是如果你给我前 20 行而不是前 2 行,我可以修改它并且可能会发现错误。我刚刚处理了这里的数据。
    • 好的,谢谢。我将数据集更新为 25 行,希望足够了。
    • 啊,对不起。我忘记了正则表达式中的句点。该行应为dmat[,15]=gsub("\".*[0-9]\"","",dmat[,15])。然后就可以了。
    【解决方案2】:

    如果您可以确定模式“1”只会出现在新行上,也许您可​​以试试这个?

    编辑:我的意思是没有第一个管道。

    library(readr)
    library(data.table)
    library(tidyverse)
    
    Einzelteil_T35 <- read_file("Einzelteil_T35.txt") %>%
      str_replace_all(. ,'\\"1\\"', "\n" ) %>%   
      fread(text = .) %>%
      as_tibble()
    

    如果不是,也许有一种方法可以使模式更加具体,例如,如果新行之前的“”总是以“.y”或其他东西开头。

    【讨论】:

    • 对于每一新行,数字增加一,这样最后一行将是“818844”。您的代码抛出此错误: fread(text = .) 中的错误:单列输入包含无效引号。自我修复仅在 ncol>1 时有效
    • 第一行包含列的名称。之后观察结果一直在变化,因此每行的第一列没有模式
    猜你喜欢
    • 1970-01-01
    • 2016-03-04
    • 2015-04-14
    • 1970-01-01
    • 2021-02-26
    • 2015-05-04
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    相关资源
    最近更新 更多