R - 清除损坏的CSV文件

时间:2016-03-30 14:37:18

标签: r csv data-processing data-cleaning

前几天我发布了一个问题并意识到我没有很好地阐述我的问题。所以我把它清理干净了,简化了。

"@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。我不想失去这些界限。

是否存在清除这些有问题的线路的清晰方法,同时不会破坏刚刚延伸下来的有益线路?

2 个答案:

答案 0 :(得分:1)

您可能需要尝试 data.table 包中的fread函数,该函数包含fill个参数。通过将此参数设置为TRUE,您将为最终要删除的 pesky 案例创建单独的行,同时保留内部带有\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

答案 1 :(得分:0)

在最后一行用"关闭时,您需要搜索不以"开头的行。 搜索

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

将其替换为

\"\r\n