将一个巨大的文件拆分成较小的文件

时间:2011-07-22 06:28:22

标签: tcl

如何使用Tcl将大文件拆分为 n 个较小的文件?要分割的文件名和要创建的文件数必须通过命令行给出。以下是我到目前为止的情况:

proc splitter { file no } {
  set lnum 0
  set file_open [open $file r]
  while {[gets $file_open line] >= 0 } {
    incr lnum
  }
  puts "$lnum"
  set num [expr $lnum/$no]
  close $file_open
}

2 个答案:

答案 0 :(得分:3)

这是分割文本文件的一种方法,它具有不会立即在内存中保留太多内容的优点。 (您也可以拆分二进制文件,但是您需要使用read而不是gets,还要考虑数据中是否有记录边界;文本大部分都比较简单。)

#!/usr/bin/env tclsh8.5
proc splitter {filename fileCount} {
    set targetFileSize [expr {[file size $filename] / $fileCount}]
    set n 0
    set fin [open $filename]
    while {[gets $fin line]} {
        if {![info exist fout]} {
            set fout [open $filename.split_[incr n] w]
        }
        puts $fout $line
        if {[tell $fout] > $targetFileSize} {
            close $fout
            unset fout
        }
    }
    if {[info exist fout]} {
        close $fout
    }
    close $fin
}
splitter {*}$argv;   # Connect to outside command line

答案 1 :(得分:2)

  • 使用全局argv数组访问命令行参数
  • 在您读取文件以计算行数后,您可以seek返回文件顶部而不是关闭文件句柄。
  • 如果您使用的是* nix,是否考虑过使用exec来呼叫split