Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tcl 8.5中针对大文件的打开/读取命令_Tcl - Fatal编程技术网

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

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

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

无论如何,我在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 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包含2500万行,但您的划分并不均匀:前四行每行包含1M行,其余的进入File5.txt。如果要平均分割文件,则断点应为20M、15M、10M和5M
  • 除此之外,我没有注意到任何数据丢失。我没有一台Windows机器来试用它

  • “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:好的,你是说脚本实际上逐行读取文件,不应该有任何限制?这是我最初相信的,但有了那个文件,我开始怀疑。可能是文件中某个字符导致了它?嗯,是的,我相应地调整了脚本,这样就不会丢失数据。以上只是脚本的一个示例,与我使用的脚本类似。