【问题标题】:Open/read command in Tcl 8.5 for large files在 Tcl 8.5 中打开/读取大文件的命令
【发布时间】: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 就像邪恶的奥托建议的那样,但恐怕我不太明白channelIDnamevalue 是如何工作来逃避那个角色的。嗯...帮忙?

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

【问题讨论】:

  • 1.22 是结果文件的组合大小吗?输入文件是文本还是二进制?
  • 应该可以;大文件支持是在 8.4 中添加的,您不会尝试一次读取所有数据……
  • “file.txt”中是否可能有任何二进制数据?在 windows 下,如果 tcl 在文件中读取 ^Z(默认为 eofchar),它将标记 eof。您可以使用 fconfigure 将其关闭 - 有关详细信息,请参阅文档。
  • @pn8830:1.22 GB 是组合大小(较小文件的大小),但也是单个文件。假设我对其进行了更改,以便将每一行复制到一个新文件中,该文件将为 1.22 GB。它是一个文本文件。
  • @Donal:好的,你是说脚本实际上是逐行读取文件,应该没有任何限制?这就是我最初所相信的,但是有了那个文件,我开始怀疑了。也许文件中的某个字符会导致它?

标签: tcl


【解决方案1】:

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

fconfigure $data -eofchar {}

查看文档了解完整详情。

【讨论】:

    【解决方案2】:

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

    1. incr count 应该在循环的开头——一个小点。
    2. 更重要的是,File.txt 包含 25M 行,但你划分不均:前四行各包含 1M,其余进入 File5.txt。如果要平均分文件,那么断点应该是20M、15M、10M和5M。
    3. 除此之外,我没有发现任何数据丢失。我没有 Windows 机器可以试用。

    【讨论】:

    • 嗯,是的,我相应地调整了脚本,这样我就不会丢失数据。以上只是脚本的一个示例,与我使用的类似。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    相关资源
    最近更新 更多