【问题标题】:readr read_fwf strange parsing error: embedded nullreadr read_fwf 奇怪的解析错误:embedded null
【发布时间】:2020-01-11 04:04:54
【问题描述】:

我正在尝试使用readr::read_fwf 来读入一个 .txt 文件。我知道所有的列宽,但我收到了这个解析错误,我不知道如何解决:

 fwf_widths <- c(12, 2, 6, ...) 
 fwf_names <- c("V1", "V2", "V3", ...)
 col_types <- c("ccc...")

 df <- read_fwf(file = file, fwf_widths(fwf_widths, fwf_names), 
                         col_types = col_types)
Warning: 1 parsing failure.
row         col expected        actual        file                                                                         

372722 description          embedded null     /path/to/my/file.txt

我尝试添加 trim_ws = T 并没有消除错误。我查看了df[372722, ] 的实际内容,看起来description 包含正确的内容。有人可以帮我解释一下embedded null 的含义以及我可以如何处理这个问题吗?

【问题讨论】:

  • 如果没有可重现的示例,很难调试问题。你能包括一个吗?
  • 感谢您的回复!很难为有关读取 fwf 文件的问题创建可重现的示例。我认为我主要在努力解决的是如何理解“嵌入式空值”本身,这并不需要一个玩具数据集。 “嵌入”意味着变量编码有一些难以阅读的方面。 “null”让我觉得这个变量周围可能有某种空格,这个解析错误无法解释。我只是在寻找有关该主题的任何文档,我似乎找不到。再次感谢
  • 我遇到了类似的问题,最终使用trsed 对文件进行了预处理(在readr::read.csv 或其他之前),superuser.com/a/287998 中的建议。

标签: r parsing readr read.fwf


【解决方案1】:

您的 fwf 中的一个字节是零值字节,这在 R 字符串中是非法的。如果只是将其删除,则会破坏 fwf 中后续条目的对齐方式,因此您需要替换它。默认情况下,以下函数将在任何零字节位置写入一个空格字符。

使用前请备份您的 .fwf 文件

replace_null <- function(path_to_file, file_size = 10000000L, replace_with = ' ')
{
  file_data <- readBin(path_to_file, "raw", file_size)
  file_data[data == as.raw(0)] <- as.raw(as.numeric(charToRaw(replace_with)))
  writeBin(file_data, path_to_file)
}

现在你只需要做

replace_null(file_path)

然后您自己的代码应该可以工作。如果没有,您的 fwf 一定已损坏。

【讨论】:

  • 感谢您的回复,尽管我仍然遇到此问题,但这确实很有帮助。如果我在 csv 中遇到同样的问题,仅删除零值字节有什么问题吗?
  • 不,除非文件损坏并且空值覆盖了逗号,否则应该没问题。
猜你喜欢
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多