对于大文件,在Tcl 8.5中打开/读取命令

时间:2012-12-18 12:37:56

标签: tcl

如果标题与我的问题不符,我很抱歉,我仍然不确定应该怎么做。

无论如何,我一直在Windows上使用Tcl / Tk(wish)一段时间,直到最近才写到我编写的脚本没有遇到任何问题。该脚本应该将一个大的txt文件分解为可以导入到excel的较小文件(我说的是打破一个文件,可能有25M行,大约2.55 GB)。

我当前的脚本是这样的:

set data [open "file.txt" r]
set data1 [open "File Part1.txt" w]
set data2 [open "File Part2.txt" w]
set data3 [open "File Part3.txt" w]
set data4 [open "File Part4.txt" w]
set data5 [open "File Part5.txt" w]


set count 0
while {[gets $data line] != -1} {
    if {$count > 4000000} {
        puts $data5 $line
    } elseif {$count > 3000000} {
        puts $data4 $line
    } elseif {$count > 2000000} {
        puts $data3 $line
    } elseif {$count > 1000000} {
        puts $data2 $line
    } else {
        puts $data1 $line
    }
    incr count
}

close $data
close $data1
close $data2
close $data3
close $data4
close $data5

我更改if中的数字以获得每个文件所需的行数,或者在需要时添加/删除任何elseif

问题是,对于我得到的最新文件,我最终只得到了大约一半的数据(1.22 GB而不是2.55 GB),我想知道是否有一条线告诉Tcl忽略了它的限制读。我试图寻找它,但我没有找到任何东西(或者我能理解的任何东西;我仍然是Tcl ^^的业余爱好者;)。任何人都可以帮助我吗?

编辑(更新): 我找到了一个打开大文本文件的程序,并设法直接预览文件的内容。实际上有16,756,263行。我将脚本更改为:

set data [open "file.txt" r]
set data1 [open "File Part1.txt" w]

set count 0
while {[gets $data line] != -1} {
    incr count
}
puts $data1 $count
close $data
close $data1

获取脚本阻止的位置并在此处停止: enter image description here

文本编辑器在中间的行中没有识别出一个字符,显示为一个小方块。我试图使用fconfigure像邪恶的otto建议,但我担心我不太明白channelIDnamevalue如何完全逃脱这个角色。嗯......帮帮忙?

reEDIT :我设法了解fconfigure是如何运作的!谢谢邪恶的奥托!嗯,我不知道如何选择你的答案,因为这是一个评论,而不是一个正确的答案......

2 个答案:

答案 0 :(得分:2)

“file.txt”中是否有可能存在任何二进制数据?在windows下,如果tcl在文件中读取^Z(默认eofchar),则会标记eof。您可以使用fconfigure

关闭此功能
fconfigure $data -eofchar {}

有关详细信息,请参阅文档。

答案 1 :(得分:1)

我在基于Unix的Mac上运行您的脚本,并注意到以下内容:

  1. incr count应位于循环的开头 - 一个小点。
  2. 更重要的是, File.txt 包含25M行,但是你的分割不均匀:前四个每行包含1M,其余的则进入 File5.txt 。如果要均匀分割文件,则断点应为20M,15M,10M和5M。
  3. 除此之外,我没有注意到任何数据丢失。我没有Windows机器可以试用。