Разделение огромного файла на файлы меньшего размера - PullRequest
2 голосов
/ 22 июля 2011

Как я могу разделить огромный файл на n количество файлов меньшего размера, используя Tcl? Имя файла для разделения и количество файлов, которые будут созданы, должны быть указаны в командной строке. Вот что у меня пока так:

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 ]

3 голосов
/ 22 июля 2011

Вот один из способов разделения текстовых файлов, который имеет преимущество, заключающееся в том, что он не занимает много места в памяти сразу. (Вы также можете разделить двоичные файлы, но тогда вам нужно будет использовать 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
2 голосов
/ 22 июля 2011
  • использовать глобальный массив argv для доступа к параметрам командной строки
  • после того, как вы прочитали файл для подсчета строк, вместо закрытия дескриптора файла вы можете seek вернуться к началу файла.
  • если вы используете * nix, рассматривали ли вы возможность использования exec для вызова split?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...