7

抱歉,如果标题与我的问题不符,我仍然不确定应该如何表达。

无论如何,我在 Windows ( wish) 上使用 Tcl/Tk 已经有一段时间了,直到最近我写的脚本还没有遇到任何问题。该脚本应该将一个大的 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

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

中间行中有一个文本编辑器无法识别的字符,显示为一个小方块。我尝试fconfigure像邪恶的 otto 建议的那样使用,但恐怕我不太明白channelID,name或如何value工作以逃避该角色。嗯……救命?

重新编辑:我设法找出了fconfigure工作原理!谢谢邪恶的奥托!嗯,我不确定如何“选择”你的答案,因为它是评论而不是正确的答案......

4

2 回答 2

2

“file.txt”中是否可能有任何二进制数据?^Z在 Windows 下,如果 tcl 读取文件中的 a (默认值),它将标记 eof eofchar。您可以使用以下命令将其关闭fconfigure

fconfigure $data -eofchar {}

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

于 2012-12-19T17:15:01.730 回答
1

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

  1. incr count应该在循环的开头——一个小问题。
  2. 更重要的是,File.txt包含 25M 行,但您划分不均:前四个各包含 1M,其余进入File5.txt。如果要平均划分文件,那么断点应该是20M、15M、10M和5M。
  3. 除此之外,我没有注意到任何数据丢失。我没有 Windows 机器来试用它。
于 2012-12-18T16:16:05.587 回答