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

Hug*_*ime 1 sql csv sqlite import r

我可以使用什么方法删除从CSV/TXT文件,该文件是太大了具体的太行加载到内存中,并手动编辑?

背景

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

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

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

给出的错误是:

./csvfilename line 102206973 expected 9 columns of data but found 3)
Run Code Online (Sandbox Code Playgroud)

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

我看到了两个潜在的"间接"解决方案,我希望有人可以帮助我.

(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)
Run Code Online (Sandbox Code Playgroud)

谢谢!

fed*_*qui 6

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

sed -e '102206973d' your_file
Run Code Online (Sandbox Code Playgroud)

如果您希望替换就地完成,请执行此操作

sed -i.bak -e '102206973d' your_file
Run Code Online (Sandbox Code Playgroud)

这将创建备份名称your_file.bakyour_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
Run Code Online (Sandbox Code Playgroud)

  • @Hugstime`sed`是一个UNIX实用程序.您可以直接从控制台使用它.您也可以在Windows中使用cygwin. (2认同)