【问题标题】:Opening .bcp files in R在 R 中打开 .bcp 文件
【发布时间】:2019-02-11 19:40:18
【问题描述】:

我一直在尝试将 .bcp 文件格式的英国慈善委员会数据转换为 .csv 文件格式,然后可以将其读入 R。我所指的数据可在此处获得:http://data.charitycommission.gov.uk/。我要做的是将这些 .bcp 文件转换为可用的数据帧,我可以在 R 中清理和运行分析。

在这个 github 页面 https://github.com/ncvo/charity-commission-extract 上有关于如何通过 python 执行此操作的建议,但不幸的是,我无法让这些选项起作用。

我想知道是否有任何语法或包可以让我直接在 R 中打开这些数据?我还没找到。

另一种选择是使用readLines 简单地将R 中的文件作为单个字符向量打开。我已经这样做了,文件用@**@ 分隔列,*@@* 分隔行。 (见这里:http://data.charitycommission.gov.uk/data-definition.aspx)。是否有一个 R 命令可以让我从一个长字符串创建一个数据框,为行和列定义分隔符?

【问题讨论】:

  • 我不能给你一个明确的 R 解决方案,但我有经验在那个数据集上遇到这个挑战。像许多问题一样,它归结为字符编码——你链接到的 Python 脚本在 Windows 中的某些行对我来说失败了,但我通过了运行 Linux 的人,它就可以工作了。
  • 谢谢你 - 我无法让那些 python 脚本在 Windows 中工作,所以我很高兴不仅仅是我。我主要在 R 中工作,所以我想知道这是否只是我在 python 方面的能力不足,很高兴听到其他人遇到问题。
  • 只需在子行文本编辑器中使用替换...用;替换@**@,用'\n'替换*@@*...另存为csv..不是你可以使用fread 或您喜欢的其他阅读器轻松导入..
  • @Wimpel 我确实在 sublime 文本编辑器中尝试过(我曾尝试在 notepad++ 中做同样的事情)但它因文件大小而崩溃。不过,您下面的解决方案似乎可以解决问题。

标签: r bcp file-conversion


【解决方案1】:

R-解决方案

修改版

不确定是否所有 .bcp 文件的格式都相同。我下载了您提到的数据集,并尝试了最小文件的解决方案; extract_aoo_ref.bcp

library(data.table)

#read the file as-is
text <- readChar("./extract_aoo_ref.bcp", 
                 nchars = file.info( "./extract_aoo_ref.bcp" )$size, 
                 useBytes = TRUE)
#replace column and row separator
text <- gsub( ";", ":", text)
text <- gsub( "@\\*\\*@", ";", text)
text <- gsub( "\\*@@\\*", "\n", text, perl = TRUE)
#read the results
result <- data.table::fread( text, 
                             header = FALSE, 
                             sep = ";", 
                             fill = TRUE, 
                             quote = "", 
                             strip.white = TRUE)

head(result,10)

#    V1 V2                           V3                                           V4 V5 V6
# 1:  A  1 THROUGHOUT ENGLAND AND WALES At least 10 authorities in England and Wales  N NA
# 2:  B  1             BRACKNELL FOREST                             BRACKNELL FOREST  N NA
# 3:  D  1                  AFGHANISTAN                                  AFGHANISTAN  N  2
# 4:  E  1                       AFRICA                                       AFRICA  N NA
# 5:  A  2           THROUGHOUT ENGLAND      At least 10 authorities in England only  N NA
# 6:  B  2               WEST BERKSHIRE                               WEST BERKSHIRE  N NA
# 7:  D  2                      ALBANIA                                      ALBANIA  N  3
# 8:  E  2                         ASIA                                         ASIA  N NA
# 9:  A  3             THROUGHOUT WALES        At least 10 authorities in Wales only  Y NA
# 10:  B  3                      READING                                      READING  N NA

对于棘手的文件也是如此; extract_charity.bcp

head(result[,1:3],10)
#       V1 V2                                                                                 V3
# 1: 200000  0                                                          HOMEBOUND CRAFTSMEN TRUST
# 2: 200001  0                                                          PAINTERS' COMPANY CHARITY
# 3: 200002  0                                              THE ROYAL OPERA HOUSE BENEVOLENT FUND
# 4: 200003  0                                                          HERGA WORLD DISTRESS FUND
# 5: 200004  0 THE WILLIAM GOLDSTEIN LAY STAFF BENEVOLENT FUND (ROYAL HOSPITAL OF ST BARTHOLOMEW)
# 6: 200005  0                              DEVON AND CORNWALL ROMAN CATHOLIC DEVELOPMENT SOCIETY
# 7: 200006  0                                                    THE HORLEY SICK CHILDREN'S FUND
# 8: 200007  0                                            THE HOLDENHURST OLD PEOPLE'S HOME TRUST
# 9: 200008  0                                                         LORNA GASCOIGNE TRUST FUND
# 10: 200009  0                                          THE RALPH LEVY CHARITABLE COMPANY LIMITED

所以..看起来它正在工作:)

【讨论】:

  • 我只是在 R 中测试了一种非常相似的方法。在 Windows 10 上,您的解决方案和我的解决方案适用于 extract_aoo_ref.csv,但对于 extract_charity.csv,它们都失败了,这似乎是 Windows 字符编码我在最初的评论中提到的问题。但我赞成,因为这是一个很好的解决方案,并且可能在 Linux 上有效——问题在于 Windows 的处理方式。
  • @MikeS 如果您在readChar 中使用useBytes = TRUE,它似乎可以工作。现在讨厌的错误消失了......我更新了我的答案。
  • 看起来这也适用于我,我已经在 extract_partb.bcp 上尝试过,看起来效果很好。
  • @Wimpel 使用 extract_charity.bcp 我仍然收到错误消息。看起来这可能在数据本身中:Error in data.table::fread(char_data, header = F, sep = ";", fill = TRUE) : Expecting 19 cols, but line 521 contains text after processing all cols. Try again with fill=TRUE. Another reason could be that fread's logic in distinguishing one or more fields having embedded sep=';' and/or (unescaped) '\n' characters within unbalanced unescaped quotes has failed. If quote='' doesn't help, please file an issue to figure out if the logic could be improved.
  • @SJPG 我更新了我的答案,它现在也适用于extract_charity.bcp,请参阅上面的编辑答案...我必须提出的建议是将文件中的所有; 替换为@ 987654330@。比我以后可以使用;作为列分隔符...我还在代码中添加quote="",并删除了前导和尾随空格...根据您自己的需要进行调整..
猜你喜欢
  • 2020-02-02
  • 2017-01-20
  • 2023-03-12
  • 1970-01-01
  • 2019-04-03
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
相关资源
最近更新 更多