7

タイトルが私の質問とうまく一致していない場合は申し訳ありませんが、どうすればよいかまだわかりません。

とにかく、私はwishしばらくの間 Windows ( ) で Tcl/Tk を使用してきましたが、最近まで、私が作成したスクリプトで問題に遭遇したことはありません。このスクリプトは、大きな txt ファイルを、Excel にインポートできる小さなファイルに分割することになっています (約 2.55 GB になる、おそらく 2,500 万行のファイルを分割することについて話している)。

私の現在のスクリプトは次のようなものです:

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

問題は、私が入手した最新のファイルでは、データが約半分 (2.55 GB ではなく 1.22 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

再編集:私はどのようにfconfigure働いたかを知ることができました!悪オットありがとう!ええと、適切な回答ではなくコメントであるため、回答を「選択」する方法がわかりません...

4

2 に答える 2

2

「file.txt」にバイナリデータが含まれている可能性はありますか? ^ZWindows では、ファイル内の a (デフォルト) を読み取ると、tcl は eof にフラグを立てeofcharます。これをオフにするにはfconfigure:

fconfigure $data -eofchar {}

詳細については、ドキュメントを参照してください。

于 2012-12-19T17:15:01.730 に答える
1

Unix ベースの Mac でスクリプトを実行したところ、次のことがわかりました。

  1. incr count、ループの先頭にある必要があります。マイナー ポイントです。
  2. さらに重要なことに、File.txtには 25M 行が含まれていますが、不均等に分割されています。最初の 4 つにはそれぞれ 1M が含まれており、残りはFile5.txtに含まれています。ファイルを均等に分割する場合は、ブレーク ポイントを 20M、15M、10M、5M にする必要があります。
  3. それ以外は、データの損失に気付きませんでした。試すための Windows マシンがありません。
于 2012-12-18T16:16:05.587 に答える