விக்கிமீடியத் திட்டங்களில் ஒன்றான விக்கிமூலம் என்ற நூலகத்தினை விரிவு படுத்த இவ்வினாவினைக் கேட்கிறேன். படத்தில் 1000வரிகளுக்கு மேலுள்ள ஒரு txt கோப்பு (file) உள்ளது. அதில் இடையிடையே வெற்றுவரிகள்(empty lines) உள்ளன. txt கோப்பினை readlines() வழியே படிப்பதால் list கிடைக்கிறது. அதனை for loop வழியே ஒவ்வொரு வரியாக len கொண்டு அளவிட்டு, print செய்கிறேன். முனையத்தில் தமிழ் தெளிவாகத் தெரிய (konsole) பயன்படுத்துகிறேன். அதன் திரைப்பிடிப்பை (screenshot) இணைத்துள்ளேன். இத்திரைப்பிடிப்பில் 1 என்பது வெற்றுவரிகள் (empty line) ஆகும். 94, 198, 169, 105 என்பன தரவுவரிகள் (data line) ஆகும். படத்தில் சில இடங்களில் தொடர்ந்து மூன்று 1 இருக்கும். மூன்று வெற்றுவரிகள் உள்ளன என்பதை நாம் கண்ணால் கண்டு கணக்கிடுகிறோம். அவற்றினை 123 என காட்டும் செய்வது எப்படி? படத்தில் 198க்கு அடுத்து 1,1,1 என்பது 1,2,3 என print ஆக வேண்டும். அதற்கு அடுத்து 169 உள்ளது அல்லவா? அதனை அடுத்து, 1 என்றே print ஆக வேண்டும். இரண்டு தரவுள்ள வரிகளுக்கு இடையே வரும் வெற்றுவரிகளை மட்டும் கணக்கிட்டு காட்ட வேண்டும். தொடர்ந்து வெற்றுவரிகளை 1 2 3 4 5 … எனக் கணக்கிட்டு, txt கோப்பிலுள்ள மொத்த வெற்றுவரிகளைக் கணக்கிடக் கூடாது. for loop மேலே, count = 0 பயன்படுத்தி, “if” rule வெற்றுவரிக்கு அமைத்து, count செய்தால், வரிசையாக, 1000 வரிகளிலும் மொத்தமுள்ள வெற்றுவரிகளை கூட்டிக் காட்டுகிறது. ஆனால், தனித்தனியே இரண்டு தரவு வரிகளுக்கு இடையே உள்ள வெற்று வரிகளை மட்டும் கூட்டி, அதன் எண்ணிக்கையக் காட்ட வேண்டும் எப்படி நிரல்(code) எழுதுவது? இதற்குரிய எனது நிராலக்க முயற்சியைக் காணலாம். இதற்குரிய துணைக்கோப்பினையும் இணைத்துள்ளேன்.
அடுத்து 1,1,1 என்பது 1,2,3 என print ஆக வேண்டும்
ஏன் இப்படி செய்ய வேண்டும்? 1,2,3 என்று வந்தால் படிக்கப்பட்ட வரியில் 1 எழுத்து, 2 எழுத்துக்கள், மற்றும் 3 எழுத்துக்கள் உள்ளன என்று பொருள் அல்லவா?
1 என்று வந்தால் வெற்றுவரி என்று பொருள் கொள்வதே தவறான புரிதல். மேலே உள்ள புரிதலின்படி ஒரு வரியில் 2 எழுத்துக்கள் வந்தால் வெளியீட்டில் 2 என்று காட்டும், அப்போது அதை வெற்றுவரி என்று எடுத்துக்கொள்வதா அல்லது 2 எழுத்துக்கள் உள்ள வரி என்று எடுத்துக்கொள்வதா?
எந்த நோக்கத்திற்காக வரியின் நீளத்தை (len) அளக்கின்றீர்கள் என்று கூறினால் அதை எப்படி வேறு வழியில் தீர்வு காணலாம் என்பதை பற்றி விவாதிக்கலாம்.
மூன்று அல்லது மூன்றுக்கும் மேற்பட்ட வெற்று வரிகள் வந்தால், அவ்வரிகளுக்கும் மேல் உள்ள எல்லா வரிகளை மட்டும் எடுத்து ( cut) , ஒரு விக்கிப்பக்கத்தில் சேமிக்க வேண்டும். வெற்றுவரிகள் மூன்றுக்கும் குறைவாக இருந்தால் எதுவும் செய்யக்கூடாது. மூன்று வெற்றிகள் வரும் வரை தேட வேண்டாம். இதுவே நோக்கம்.
வேறு விதமாகச் சொல்வதென்றால், for loopல் enumerate செய்தால் வரிசையில் வரும் அல்லவா? அதுபோல இரண்டு தரவுவரிகளுக்கு இடையே உள்ள வெற்று வரிகளுக்கு மட்டும் வரிசையெண் இட முயல்கிறேன். அந்த வரிசையெண் மூன்றுக்கு மேல் வந்தால் ஏற்கனவே சொல்லியபடி ஒட்ட ஏதுவாகும்.
TXT கோப்பினைப் பதிவிறக்கி, ஒருமுறை காணுங்கள்.
#!/usr/bin/env python3
import sys
def GetParagraphs(File, max_empty_lines = 3):
empty_lines_count = 0
paragraph_lines = []
paragraphs = []
for line in File:
line = line.strip()
if len(line) <= 0:
empty_lines_count += 1
else:
empty_lines_count = 0
paragraph_lines.append(line)
if empty_lines_count >= max_empty_lines:
paragraphs.append(paragraph_lines)
empty_lines_count = 0
paragraph_lines = []
return paragraphs
def main():
if len(sys.argv) < 2:
print('[usage] ' + sys.argv[0] + ' <filename>')
return
paragraph_index = 0
for paragraph_lines in GetParagraphs(open(sys.argv[1])):
print('[paragraph_index %d]'%(paragraph_index))
print('\n'.join(paragraph_lines))
paragraph_index += 1
if __name__ == '__main__':
main()
மூன்று அல்லது மூன்றுக்கும் மேற்பட்ட வெற்று வரிகள் வந்தால், அவ்வரிகளுக்கும் மேல் உள்ள எல்லா வரிகளை மட்டும் எடுத்து ( cut) , ஒரு விக்கிப்பக்கத்தில் சேமிக்க வேண்டும்
மேலே உள்ள பைத்தான் நிரல் தாங்கள் எதிர்பார்க்கும் செயலை செய்யும் என்று நினைக்கிறேன். முயற்சித்து பார்க்கவும். நிரலில் எதேனும் சந்தேகம் இருந்தால் கேட்கவும்.
மிக்க நன்றி. மாற்றங்கள் தேவையெனில் தெரிவிக்கிறேன். இதனால் விக்கிமூலத்தில் ஏற்பட்ட விளைவுகளையும் இங்கு தெரிவிப்பேன்.