【问题标题】:Read a text file with readr where a quote ends rows使用 readr 读取文本文件,其中引号结束行
【发布时间】:2018-05-07 15:47:59
【问题描述】:

我有一个看起来像这样的文本文件:

a,b,c,d
"string1","string2","string3","
"string4","string5","string6","

文件本身以逗号分隔,但每一行都以双引号结尾(即,不是逗号分隔符)。 readr::read_delim() 不理解行尾,因此尝试将所有数据读入一行。

data.table::fread() 按预期导入,但我想找到readr 解决方案(如果存在)。

【问题讨论】:

    标签: r readr


    【解决方案1】:

    在这种情况下,使用fread 似乎是迄今为止最简单的选择。如果不希望fread 返回data.table,可以使用fread 中的data.table = FALSE 参数。

    一个例子:

    fread("C:/data.txt", data.table = FALSE)
    

    【讨论】:

    • 我并不反对 data.table,但很好奇我是否遗漏了 readr 包文档中的一些明显内容。在data.table 中自动检测到行尾,而readr 似乎不是这种情况。
    • @Chris 据我所知(而且我已经广泛查看)您没有错过readr 文档中的任何内容。我猜readr 的功能不如fread 灵活,后者有其优点和缺点(如本例所示)。
    【解决方案2】:

    这是一个冗长的方法,但肯定有一个更简洁的解决方案:

    readr::read_lines("C:/data.txt", skip = 1) %>% 
      tibble::as_tibble() %>% 
      tidyr::separate(value, into = c("a", "b", "c", "d"), sep = ",") %>% 
      mutate_at(.vars = vars(a:c), 
                .funs = stringr::str_replace_all, 
                pattern = "\"", 
                replacement = "")
    

    【讨论】:

    • 有很多代码要避免使用fread。如果您因为fread 返回data.table 而不想使用它,请参阅我的答案以获得解决方案。
    • 如果我的数据包含分隔符或其他“保留”字符,我已从 read.csv 移至 readXL 以避免在导入过程中指定错误。或许考虑使用不同的数据存储选项?
    • 我同意这是很多代码。使用data.table 可以工作并且更加简洁,但希望我错过了readr 中的某些内容。
    猜你喜欢
    • 2017-01-04
    • 2010-09-25
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多