R语言如何高效在指定索引位置截断大体积文本文件
R语言大文件高效截断实现方案
你可以直接使用R内置的文件连接操作与seek()、truncate()函数实现需求,全程不需要读取整个文件内容,大文件下的执行效率和C语言版本一致。
单字节编码/按字节截断场景
如果你的n是字节数,或者文件为ASCII等单字节编码,直接使用以下代码:
n <- 1000L # 保留的前n个字节/单字节字符数 f <- "output.txt" # 打开读写模式的二进制连接,不会清空原有文件 con <- file(f, open = "r+b") # 定位到第n个字节位置,等价于C的fseek(fp, n, SEEK_SET) seek(con, where = n, origin = "start") # 截断当前位置之后的所有内容 truncate(con) # 写入追加内容 writeLines("keep going", con, useBytes = TRUE) # 关闭连接释放资源 close(con)
多字节编码/按字符数截断场景
如果文件包含中文等多字节字符,且你需要按字符数而不是字节数保留前n个内容,可以先仅读取前n个字符计算对应的字节偏移量,不需要加载全量文件:
n_char <- 1000L # 保留的前n个字符数 f <- "output.txt" # 先读取前n个字符计算实际字节偏移 con <- file(f, open = "r", encoding = "UTF-8") first_n_content <- readChar(con, nchars = n_char) byte_offset <- nchar(first_n_content, type = "bytes") close(con) # 执行截断和写入 con <- file(f, open = "r+b") seek(con, where = byte_offset, origin = "start") truncate(con) writeLines("keep going", con, useBytes = TRUE) close(con)
内容的提问来源于stack exchange,提问作者chan1142
相关产品推荐
相关产品推荐

