Tcl 将大文件拆分为小文件

Tcl 将大文件拆分为小文件,tcl,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

如何使用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
}
使用全局argv数组访问命令行参数 读取文件以计算行数后,可以返回到文件顶部,而不是关闭文件句柄。 如果你是在*尼克斯,你有没有考虑过用*尼克斯呼叫?
这里有一种分割文本文件的方法,它的优点是一次不占用太多内存。您还可以拆分二进制文件,但然后需要使用Read而不是GET,并且还要考虑数据中是否存在记录边界;文本通常更简单

#!/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

这将按近似的文件大小而不是行长度进行分割,但当所有行的长度都相似时,差异最小,这意味着您可以在一次传递中完成这一切。