将大文件分割成小文件

发布于 2024-11-25 17:33:25 字数 304 浏览 0 评论 0原文

如何使用 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
}

How can I split a huge file into n number of smaller files using Tcl? The file name to split and number of files to be created have to be given through command line. Here is what I have so far:

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
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

阳光下的泡沫是彩色的 2024-12-02 17:33:25

这是分割文本文件的一种方法,其优点是不会一次在内存中保存太多内容。 (也可以拆分二进制文件,但是需要使用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

Here is one way to split text files, which has the advantage of not holding much in memory at once. (You can also split binary files, but then you need to use read instead of gets, and also to consider whether there are record boundaries in the data; text is mostly simpler.)

#!/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
心奴独伤 2024-12-02 17:33:25
  • 使用全局 argv 数组访问命令行参数
  • 读取文件后 来计算行数,而不是关闭文件句柄,您可以 seek 返回到文件顶部。
  • 如果您使用 *nix,您是否考虑过使用 exec< /code>调用 split
  • use the global argv array to access command line parameters
  • after you read the file to count the lines, instead of closing the file handle, you can seek back to the top of the file.
  • if you're on *nix, have you considered using exec to call out to split?
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文