4

我正在处理美国气象服务风暴数据,从 1950 年开始,它每年都有一个大型 CSV 数据文件。1999 年的文件包含几行具有非常大的自由格式文本字段,其中包含嵌入的 NUL 字符,在其他 vanilla ascii 数据库中。(违规文件位于ftp://ftp.ncdc.noaa.gov/pub/data/swdi/stormevents/csvfiles/StormEvents_details-ftp_v1.0_d1999_c20140915.csv.gz)。

R 无法正确处理损坏的字符串数据,这包括 R data.frame、data.table、stringr 和 stringi 包函数(已尝试)。

我可以使用 sed 清理 NUL 的文件,但我不希望使用外部程序,因为这是用于带有嵌入式代码的 R 降价类型报告。

建议?

4

3 回答 3

3

也许这可能会有所帮助:

in.file <- file(description = "StormEvents_details-ftp_v1.0_d1999_c20140915.csv", 
                open = "r")
writeLines(iconv(readLines(in.file), to = "ASCII"), 
           con = "StormEvents_ascii.csv")

通过此调用 do read.table,我能够读取 csv 文件而没有错误:

options(stringAsFactors = FALSE)
StormEvents <- read.table("StormEvents_ascii.csv", header = TRUE, 
                           sep = ",", fill = TRUE, quote = '"')

显然,您需要更改几列的类,因为所有列都被视为字符。

于 2015-03-11T08:27:49.163 回答
1

只是为了后代 - 您可以使用二进制读取 ( readBin()) 并将NULs 替换为其他任何内容 - 请参阅 删除“NUL”字符(在 R 内)

于 2015-12-11T02:42:57.297 回答
0

base::read.*()2020 年 5 月的更新: tidyverse和data.table 仍然会在文件中出现空字符,但readLines()会通过选项优雅地跳过它们skipNul=TRUE。您可以跳过空字符读取文件,然后再次将其写回。

于 2020-05-04T10:04:01.507 回答