在Tcl 8.5中打开/读取大文件的命令

对不起,如果标题不符合我的问题,我仍然不确定应该如何表达。

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

我目前的脚本是这样的:

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

获取脚本阻止的位置并停止在此处: 在这里输入图像描述

有一个字符,文本编辑器在中间线没有识别为小方块。 我试图使用fconfigure像邪恶的otto建议,但恐怕我不太明白channelIDnamevalue如何正确工作以逃避该角色。 呃......帮忙?

reEDIT :我设法弄清楚fconfigure是如何工作的! 感谢邪恶的otto! 嗯,我不知道我怎么能'选择'你的答案,因为它是一个评论,而不是一个正确的答案...


“file.txt”中是否有任何二进制数据? 在windows下,如果tcl读取文件中的^Z (默认eofchar ),它将标记eof。 你可以用fconfigure来关闭它:

fconfigure $data -eofchar {}

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


我在一台基于Unix的Mac上运行脚本,并注意到以下几点:

  • incr count应该在循环的开始处 - 一个小点。
  • 更重要的是,File.txt包含25M行,但您分配不均匀:前四个分别包含1M,其余分配到File5.txt。 如果你想均匀分割文件,那么中断点应该是20M,15M,10M和5M。
  • 除此之外,我没有注意到任何数据丢失。 我没有Windows机器来试用它。
  • 链接地址: http://www.djcxy.com/p/11603.html

    上一篇: Open/read command in Tcl 8.5 for large files

    下一篇: Idea 12, How do I indicate some spring files are used only for Tests