【发布时间】:2012-12-05 16:08:43
【问题描述】:
抱歉,如果标题与我的问题不太相符,我仍然不确定应该如何表达。
无论如何,我在 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 就像邪恶的奥托建议的那样,但恐怕我不太明白channelID、name 或value 是如何工作来逃避那个角色的。嗯...帮忙?
reEDIT:我设法找出了fconfigure 的工作原理!谢谢邪恶的奥托!嗯,我不确定如何“选择”您的答案,因为它是评论而不是正确答案...
【问题讨论】:
-
1.22 是结果文件的组合大小吗?输入文件是文本还是二进制?
-
应该可以;大文件支持是在 8.4 中添加的,您不会尝试一次读取所有数据……
-
“file.txt”中是否可能有任何二进制数据?在 windows 下,如果 tcl 在文件中读取
^Z(默认为eofchar),它将标记 eof。您可以使用fconfigure将其关闭 - 有关详细信息,请参阅文档。 -
@pn8830:1.22 GB 是组合大小(较小文件的大小),但也是单个文件。假设我对其进行了更改,以便将每一行复制到一个新文件中,该文件将为 1.22 GB。它是一个文本文件。
-
@Donal:好的,你是说脚本实际上是逐行读取文件,应该没有任何限制?这就是我最初所相信的,但是有了那个文件,我开始怀疑了。也许文件中的某个字符会导致它?
标签: tcl