如何从30gb csv文件中删除特定行(例如102,206,973行)?

时间:2013-11-04 11:23:42

标签: sql r sqlite csv import

我可以使用哪种方法从csv / txt文件中删除太大的特定行,并将其加载到内存中并手动编辑?

背景

我的问题实际上是与将csv导入sql数据库相关的问题的间接解决方案。

我有一系列10-30gb的csv文件我想导入并从R中填充一个sqlite表(因为它们太大而无法作为整体导入R中的数据帧)。我正在使用' RSQlite'为此包装。

由于与其中一行格式错误相关的错误,一对夫妇失败了。然后取消填充过程。 R返回导致进程失败的行号。

给出的错误是:

./csvfilename line 102206973 expected 9 columns of data but found 3)

所以我确切地知道导致错误的那一行。

我看到2个潜在的'间接'解决方案,我希望有人可以帮助我。

(i)删除导致20 + gb文件错误的行。例如上面例子中的第102,206,973行。 我并不担心失去'通过跳过或删除它来排队102,206,973中的数据。但是我已经尝试过并且无法以某种方式访问​​csv文件并删除该行。

(ii)直接使用sqlite(或其他任何东西?)导入一个允许你跳过行或错误的csv。

虽然不太可能与解决方案直接相关,但这里使用的是R代码。

db <- dbConnect(SQLite(), dbname=name_of_table)
dbWriteTable(conn = db, name ="currentdata", value = csvfilename, row.names = FALSE, header = TRUE)

谢谢!

1 个答案:

答案 0 :(得分:6)

要删除特定行,您可以使用sed

sed -e '102206973d' your_file

如果您希望替换就地,请执行

sed -i.bak -e '102206973d' your_file

这将创建一个备用名称your_file.bak,而your_file将删除指定的行。

实施例

$ cat a
1
2
3
4
5
$ sed -i.bak -e '3d' a
$ cat a
1
2
4
5
$ cat a.bak 
1
2
3
4
5