【问题标题】:Import address text file导入地址文本文件
【发布时间】:2015-09-10 00:20:49
【问题描述】:

我有一个包含几百万行的文本文件。每行应该有 10 个变量。它是用逗号分隔的,但每隔一段时间,变量中间就会有一个逗号(例如:第 3 行,“BLDG #5,#104”应该是一个变量,但是当我使用 read.csv() 导入时,它会变得很糟糕一切都好)。这是一个例子:

1,09/29/1951,F,N,22 MAIN STREET AVE,APT 3,SEATTLE,WA,98102-3053,00920670025
2,09/28/1950,F,N,13354 A STREET,APT 2,BURLINGTON,VT,10101,02510070025
3,10/18/1949,M,N,600 CENTRE STREET,BLDG #5,#104,SPRINGFIELD,IL,01010,02141650025 
4,10/18/1955,M,N,5 KELLY AVENUE,,CITY,XI,10101,02141650025

关于如何最好地导入这些数据有什么建议吗?

【问题讨论】:

  • 如果是文本文件为什么要使用read.csv() 如果你想快速读取大文件,请尝试使用library(data.table) 中的fread(FILE, sep=",") ...如果它是.csv 文件那么尝试使用read.csv2()@afleishman
  • 与您的输入混淆的其他声音是“#”。默认情况下它是“comment.char”。如果多余的逗号总是被八角形包围,那么可能有一个解决方案。我知道如何识别逗号过多的行。你为什么不做更多的侦探工作,更完整地描述问题?
  • 我没有投票结束,尤其是原因。也许有人不小心点击了投票关闭?
  • @TylerRinker 这是今晚 [r] 标签中的第三个问题,其中有一个“坏演员”在有效问题上使用了这个接近的理由。我将它标记给 uber SO 模组,看看他们是否可以对此做点什么。

标签: r import read.csv


【解决方案1】:

为什么不直接利用read.csv 的优势呢?

dat <- read.csv(text="1,09/29/1951,F,N,22 MAIN STREET AVE,APT 3,SEATTLE,WA,98102-3053,00920670025
2,09/28/1950,F,N,13354 A STREET,APT 2,BURLINGTON,VT,10101,02510070025
3,10/18/1949,M,N,600 CENTRE STREET,BLDG #5,#104,SPRINGFIELD,IL,01010,02141650025 
4,10/18/1955,M,N,5 KELLY AVENUE,,CITY,XI,10101,02141650025", 
           header=FALSE, stringsAsFactors=FALSE, comment.char="", fill=TRUE)

for (i in 1:nrow(dat)) {
  if (is.na(dat[i, "V11"])) {
    dat[i, 8:11] <- dat[i, 7:10]
    dat[i, "V7"] <- NA
  }
}

dat

##   V1         V2 V3 V4                 V5      V6   V7          V8 V9        V10        V11
## 1  1 09/29/1951  F  N 22 MAIN STREET AVE   APT 3 <NA>     SEATTLE WA 98102-3053  920670025
## 2  2 09/28/1950  F  N     13354 A STREET   APT 2 <NA>  BURLINGTON VT      10101 2510070025
## 3  3 10/18/1949  M  N  600 CENTRE STREET BLDG #5 #104 SPRINGFIELD IL       1010 2141650025
## 4  4 10/18/1955  M  N     5 KELLY AVENUE         <NA>        CITY XI      10101 2141650025

如果你想组合V6 + V7,那是完全可行的。

使用data.table 风格执行此操作会更有效率(即,如果有人发布fread + 纯data.table 解决方案,该解决方案将获得“答案”标记。

【讨论】:

    【解决方案2】:

    这使用 countfields 标识具有额外字段的行,然后使用 sub 删除两个八角形 ("#") 之间的逗号。鉴于数据集的大小,我猜会有更多问题,您应该会发现count.fields 将非常有用(见下文):

    > Lines
    [1] "1,09/29/1951,F,N,22 MAIN STREET AVE,APT 3,SEATTLE,WA,98102-3053,00920670025\n2,09/28/1950,F,N,13354 A STREET,APT 2,BURLINGTON,VT,10101,02510070025\n3,10/18/1949,M,N,600 CENTRE STREET,BLDG #5,#104,SPRINGFIELD,IL,01010,02141650025\n4,10/18/1955,M,N,5 KELLY AVENUE,,CITY,XI,10101,02141650025"
    > myLines <- readLines(textConnection(Lines))
    > myLines
    [1] "1,09/29/1951,F,N,22 MAIN STREET AVE,APT 3,SEATTLE,WA,98102-3053,00920670025"     
    [2] "2,09/28/1950,F,N,13354 A STREET,APT 2,BURLINGTON,VT,10101,02510070025"           
    [3] "3,10/18/1949,M,N,600 CENTRE STREET,BLDG #5,#104,SPRINGFIELD,IL,01010,02141650025"
    [4] "4,10/18/1955,M,N,5 KELLY AVENUE,,CITY,XI,10101,02141650025"                      
    > myLines[ count.fields(textConnection(myLines),sep=",", comment.char="") >10] <- sub("(#\\d+)(\\,)#", "\\1 &", myLines[ count.fields(textConnection(myLines),sep=",", comment.char="") >10])
    > myLines
    [1] "1,09/29/1951,F,N,22 MAIN STREET AVE,APT 3,SEATTLE,WA,98102-3053,00920670025"     
    [2] "2,09/28/1950,F,N,13354 A STREET,APT 2,BURLINGTON,VT,10101,02510070025"           
    [3] "3,10/18/1949,M,N,600 CENTRE STREET,BLDG #5 &104,SPRINGFIELD,IL,01010,02141650025"
    [4] "4,10/18/1955,M,N,5 KELLY AVENUE,,CITY,XI,10101,02141650025"                      
    > read.csv(text=myLines, comment.char="",header=FALSE)
      V1         V2 V3 V4                 V5           V6          V7 V8         V9        V10
    1  1 09/29/1951  F  N 22 MAIN STREET AVE        APT 3     SEATTLE WA 98102-3053  920670025
    2  2 09/28/1950  F  N     13354 A STREET        APT 2  BURLINGTON VT      10101 2510070025
    3  3 10/18/1949  M  N  600 CENTRE STREET BLDG #5 &104 SPRINGFIELD IL      01010 2141650025
    4  4 10/18/1955  M  N     5 KELLY AVENUE                     CITY XI      10101 2141650025
    

    我建议使用table(count.fields( filename, sep=",", comment.char=""))) 来更好地估计问题的严重程度。我怀疑你只是找到了许多中的第一个。

    【讨论】:

      猜你喜欢
      • 2022-08-22
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多