Tcl 8.5中针对大文件的打开/读取命令
很抱歉,如果标题与我的问题不符,我仍然不确定该怎么说 无论如何,我在Windows(Tcl 8.5中针对大文件的打开/读取命令,tcl,Tcl,很抱歉,如果标题与我的问题不符,我仍然不确定该怎么说 无论如何,我在Windows(wish)上使用Tcl/Tk已经有一段时间了,直到最近我才在编写的脚本中遇到任何问题。这个脚本应该将一个大的txt文件分解成可以导入excel的小文件(我说的是分解一个大约有2500万行的文件,大约有2.55GB) 我当前的脚本是这样的: set data [open "file.txt" r] set data1 [open "File Part1.txt" w] set data2 [open "File P
wish
)上使用Tcl/Tk已经有一段时间了,直到最近我才在编写的脚本中遇到任何问题。这个脚本应该将一个大的txt文件分解成可以导入excel的小文件(我说的是分解一个大约有2500万行的文件,大约有2.55GB)
我当前的脚本是这样的:
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.22GB而不是2.55GB),我想知道是否有一行代码告诉Tcl忽略它可以读取的限制。我试图寻找它,但没有找到任何东西(或者任何我能很好理解的东西;我仍然是Tcl的业余爱好者)。有人能帮我吗
编辑(更新):
我找到了一个打开大型文本文件的程序,并设法直接获得文件内容的预览。实际上有16756263行。我将脚本更改为:
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
要获取脚本阻塞的位置并在此处停止,请执行以下操作:
<> P>有一个字符,文本编辑器在中间行中不被识别为一个小正方形。我试图像邪恶的奥托建议的那样使用fconfigure
,但我恐怕不太明白channelID
、name
或value
是如何准确地转义该字符的。嗯。。。帮忙
重新编辑:我设法找到了
fconfigure
的工作原理!谢谢邪恶的奥托!嗯,我不确定如何“选择”您的答案,因为这是一个注释而不是正确的答案…我在基于Unix的Mac上运行了您的脚本,并注意到以下几点:
incr count
应该在循环的开始处——一个次要点“file.txt”中是否可能有任何二进制数据?在windows下,如果tcl读取文件中的
^Z
(默认的eofchar
),它将标记eof。您可以使用fconfigure
关闭此功能:
fconfigure $data -eofchar {}
有关详细信息,请参阅文档。1.22是结果文件的组合大小吗?输入文件是文本还是二进制?应该可以;在8.4中添加了大文件支持,您不想一次读取中的所有数据……是否可能在“file.txt”中有任何二进制数据?在windows下,如果tcl读取文件中的
^Z
(默认的eofchar
),它将标记eof。您可以使用fconfigure
-查看文档以了解详细信息。@pn8830:1.22 GB是组合大小(较小文件的大小加在一起),但也是单个文件的大小。假设我更改它,使它将每一行复制到一个新文件中,该文件将为1.22GB。这是一个文本文件。@Donal:好的,你是说脚本实际上逐行读取文件,不应该有任何限制?这是我最初相信的,但有了那个文件,我开始怀疑。可能是文件中某个字符导致了它?嗯,是的,我相应地调整了脚本,这样就不会丢失数据。以上只是脚本的一个示例,与我使用的脚本类似。