【问题标题】:R - Cleaning a broken CSV fileR - 清理损坏的 CSV 文件
【发布时间】:2016-07-18 15:35:43
【问题描述】:

前几天我发布了一个问题,并意识到我没有很好地表达我的问题。所以我把它清理了,让它变得更简单了。

"@realdonaldtrump","19301000","19300609","Jody"
"@realdonaldtrump","1350700000","1350725479","Bobby
Fischer"
"@realdonaldtrump","870440000","870442502","Lenny"
Phone</a>"
"@realdonaldtrump","4831200000","4831194209","Tom"
"@realdonaldtrump","4.397e+09","4397021841","Dave"
"@realdonaldtrump", "12345678","9012345678", "Zee
G

Zeek"

我的 CSV 数据存在一些问题。我需要清理它,这样我才能用 R 读取它。

我期望返回 6 个条目,Jody、Bobby Fischer、Lenny、Tom 和 Dave、Zee G Zeek 各一个。

但是,那个讨厌的“电话”神器把事情搞砸了。

所以我的第一个想法是 gsub 出来。问题是,该工件因数百万个条目而异。有时它的电话“。有时它的 Eck”。有时是 Twitter"。各种长度。各种格式。

另一个问题是,在“Bobby Fischer”之类的情况下,上面的一行可能在一个重要字段的中间有一个 \r\n。我不想失去这些台词。

是否存在一种明确的方法来清除这些有问题的线条,同时又不会破坏恰好向下延伸的有益线条?

【问题讨论】:

  • 您的工件是否包含逗号?如果没有,您可以使用 sed 或 awk 或其他命令行编辑器预处理文件,并在某处删除所有没有(或两个或三个)逗号的行。 (或者名称中实际上有换行符?)
  • 您的数据集有多大,即通过readLines() 将整个数据同时吸入内存是否可行,或者我们是否应该向您提供有关命令行工具(grep、sed、awk、cut)的建议) 正如@Roland 所建议的那样?
  • 这是一个大文件 (500 MB),但可以在我的设置中一次全部读入内存。命令行编辑器很好(如果有帮助,可以在 Windows 上工作)。该文件有数百万行,但我发现的所有这些工件都不包含逗号。但是,由于嵌入换行符而只是多行的“好”行确实有逗号。

标签: r csv data-processing data-cleaning


【解决方案1】:

您需要搜索不以" 开头的行,而最后一行以" 结束。 搜索

\"\r\n[^\"]+\"

替换为

\"\r\n

【讨论】:

  • 嘿!感谢您的建议,但是如果将 Zeek 示例压缩到下一行,则会破坏像 Zeek 示例这样的行。
  • 嘿!我想补充一下,这对我 90% 的案例都有效!不过,其中一些更难一些。这是因为我的一些推文出于某种原因有“引号”。例如“我同意\r\n \r\n”“我相信可以改变人的上帝——他可以让我们中的任何一个人变得更好。”“\r\n@RealBenCarson”,theRest,ofThe,逗号分隔的文件。知道如何抓住它吗?不以“开头的行,而最后一行以”结束的情况,除非它的“”?
【解决方案2】:

您可能想尝试 data.table 包中的 fread 函数,该包具有 fill 参数。通过将此参数设置为TRUE,您将为最终要删除的那些讨厌 案例创建单独的行,同时保留内部包含\r\n 的字段。

假设数据在twit.csv:

library(data.table)
twit <- fread('twit.csv', fill=TRUE, header=FALSE)

将给予:

> twit
                 V1         V2         V3             V4
1: @realdonaldtrump   19301000   19300609           Jody
2: @realdonaldtrump 1350700000 1350725479 Bobby\nFischer
3: @realdonaldtrump  870440000  870442502          Lenny
4:       Phone</a>"                                     
5: @realdonaldtrump 4831200000 4831194209            Tom
6: @realdonaldtrump  4.397e+09 4397021841           Dave
7: @realdonaldtrump   12345678 9012345678 Zee\nG\n\nZeek

接下来您可以使用grep 过滤掉想要的值:

twit[grep('^@', V1)]

这会给你:

                 V1         V2         V3             V4
1: @realdonaldtrump   19301000   19300609           Jody
2: @realdonaldtrump 1350700000 1350725479 Bobby\nFischer
3: @realdonaldtrump  870440000  870442502          Lenny
4: @realdonaldtrump 4831200000 4831194209            Tom
5: @realdonaldtrump  4.397e+09 4397021841           Dave
6: @realdonaldtrump   12345678 9012345678 Zee\nG\n\nZeek

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 2021-05-27
  • 2019-09-26
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多