2012-12-18 9 views
7

क्षमा करें यदि शीर्षक अच्छी तरह से मेरे सवाल से मेल नहीं खाता, मैं अभी भी मैं इसे कैसे करना चाहिए के रूप में अनिश्चित हूँ।खुला/बड़ी फ़ाइलों के लिए Tcl 8.5 में आदेश को पढ़ने के

वैसे भी, मैं कुछ समय के लिए विंडोज़ (wish) पर टीसीएल/टीएस का उपयोग कर रहा हूं और हाल ही में लिखी गई स्क्रिप्ट पर किसी भी समस्या का सामना नहीं किया है। स्क्रिप्ट कि उत्कृष्टता प्राप्त करने आयात किया जा सकता छोटी फ़ाइलों (मैं शायद 25M लाइनों जो चारों ओर 2.55 जीबी आता है के साथ एक फ़ाइल टूट के बारे में बात कर रहा हूँ) में एक बड़ी txt फ़ाइल तोड़ने के लिए माना जाता है।

मेरे वर्तमान स्क्रिप्ट ऐसा ही कुछ है:

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 जीबी की बजाय 1.22 जीबी) के साथ समाप्त होता हूं और मैं सोच रहा था कि क्या एक रेखा थी जिसने टीसीएल को उस सीमा को अनदेखा करने के लिए कहा था पढ़ सकते हैं। मैंने इसे देखने की कोशिश की, लेकिन मुझे कुछ भी नहीं मिला (या कुछ भी जो मैं अच्छी तरह से समझ सकता था; मैं अभी भी टीसीएल ^^ पर शौकिया हूं); क्या कोई मेरी मदद कर सकता है?

संपादित करें (अपडेट): मैं बड़े पाठ फ़ाइलों को खोलने के लिए एक कार्यक्रम मिल गया है और फ़ाइल सीधे की सामग्री के एक पूर्वावलोकन पाने में कामयाब रहे। वास्तव में 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 

जहां स्क्रिप्ट ब्लॉक कर रहा है पाने के लिए और इसे यहाँ बंद कर दिया: enter image description here

वहाँ एक चरित्र है कि पाठ संपादक बीच एक छोटे से वर्ग के रूप में दिखाने वाले लाइन में पहचान नहीं कर रहा है । मैं बुराई ओटो तरह का सुझाव दिया है लेकिन मुझे डर है मैं काफी कैसे channelID, name या value काम वास्तव में उस चरित्र से बचने के लिए समझ में नहीं आता हूँ fconfigure का उपयोग करने की कोशिश की। उम ... मदद?

reedit: मैं पता लगाने के लिए fconfigure काम किया कामयाब रहे! धन्यवाद बुराई ओटो! उम, मुझे यकीन नहीं है कि मैं आपके उत्तर को कैसे चुन सकता हूं क्योंकि यह एक उचित उत्तर के बजाय एक टिप्पणी है ...

+0

1.22 परिणामस्वरूप फाइलों का संयुक्त आकार है? इनपुट फ़ाइल पाठ या बाइनरी है? – pn8830

+3

यह काम करना चाहिए; 8.4 में बड़े-फ़ाइल समर्थन को जोड़ा गया था और आप एक ही समय में सभी डेटा पढ़ने की कोशिश नहीं कर रहे हैं ... –

+5

क्या यह संभव है कि "file.txt" में कोई बाइनरी डेटा हो? विंडोज़ के तहत, अगर फ़ाइल में '^ Z' (डिफ़ॉल्ट 'eofchar') पढ़ता है तो टीसीएल ईओएफ ध्वजांकित करेगा। आप इसे 'fconfigure' के साथ बंद कर सकते हैं - विवरण के लिए दस्तावेज़ देखें। –

उत्तर

2

क्या यह संभव है "file.txt" में किसी भी बाइनरी डेटा नहीं है? खिड़कियों के तहत, tcl इच्छा झंडा EOF अगर यह एक ^Z (डिफ़ॉल्ट eofchar) एक फ़ाइल में पढ़ता है।आप fconfigure के साथ इस बंद कर सकते हैं:

fconfigure $data -eofchar {} 

पूर्ण विवरण के लिए दस्तावेज़ देख सकेंगे।

1

मैंने मैक पर अपनी स्क्रिप्ट चलाई, जो यूनिक्स आधारित है, और निम्न पर ध्यान दिया:

  1. incr count लूप की शुरुआत में होना चाहिए - एक मामूली बिंदु।
  2. इससे भी महत्वपूर्ण बात, file.txt 25M रेखाएं हों, फिर भी आप असमान विभाजित: पहले चार प्रत्येक 1M शामिल है, और बाकी File5.txt में चला जाता है। यदि आप फ़ाइलों को समान रूप से विभाजित करना चाहते हैं, तो ब्रेक पॉइंट 20 एम, 15 एम, 10 एम और 5 एम होना चाहिए।
  3. उसके अलावा, मैं किसी भी डेटा हानि नोटिस नहीं किया था। मेरे पास यह कोशिश करने के लिए एक विंडोज मशीन नहीं है।
+0

उम, हाँ, मैं तदनुसार स्क्रिप्ट समायोजित करता हूं इसलिए मुझे कोई डेटा हानि नहीं मिलती है। उपरोक्त स्क्रिप्ट का एक नमूना था जो मैंने उपयोग किए समान है। – Jerry

संबंधित मुद्दे