الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ترتيب ملف شكلا

بدأه fofo_last في 11 يوليو 2010 · 8 رد · 1,074 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لدي سؤال متعلق بتنضيم ملف...يعني حجز عدد من الخانات للكلمة في ملف...بحيت يطلع مرتب كل كلمة في عمود ...

انا لدي ملف زي كدا

AlAslAm   [AlAslAm]  a l a s l a m 
AlwHydyn   [AlwHydyn]  a l w h y d y n 
AtxAd   [AtxAd]  a t kh a d 
hm   [hm]  h m 
mnHhm   [mnHhm]  m n h h m 
qwp   [qwp]  q w pp 
ymlkwn   [ymlkwn]  y m l k w n

واريد كل كلمة تكون تحتها كلمات وهكدا منضم...شفت انو في داله justified بس ماعرفت كيف اسويها لكل سطر؟

حتى يبدو مرتب متل الاتي

اقتباس

AlAslAm [AlAslAm] a l a s l a m

AlwHydyn [AlwHydyn] a l w h y d y n

.........

يعني كل كلمة تحتها كلمة بالضبط وضبط الفراغات بين كلمات في السطر الواحد

#2
fofo_last كتب:

السلام عليكم

لدي سؤال متعلق بتنضيم ملف...يعني حجز عدد من الخانات للكلمة في ملف...بحيت يطلع مرتب كل كلمة في عمود ...

انا لدي ملف زي كدا

AlAslAm   [AlAslAm]  a l a s l a m 
AlwHydyn   [AlwHydyn]  a l w h y d y n 
AtxAd   [AtxAd]  a t kh a d 
hm   [hm]  h m 
mnHhm   [mnHhm]  m n h h m 
qwp   [qwp]  q w pp 
ymlkwn   [ymlkwn]  y m l k w n

واريد كل كلمة تكون تحتها كلمات وهكدا منضم...شفت انو في داله justified بس ماعرفت كيف اسويها لكل سطر؟

حتى يبدو مرتب متل الاتي

يعني كل كلمة تحتها كلمة بالضبط وضبط الفراغات بين كلمات في السطر الواحد

وخاصة مع تعامل مع ملفات يعني مو بس نص بطبعه لا كيف يتم طباعته مرتب لملف؟

#4

والله انا ساعات مااعرف اوصف مشكلتي

عموما السموحه

الموضوع ببساطة النص الي فوق هو مخرجات لملف من تلات اعمدة .... بس زي ماشايفين كل شي داخل ببعضه؟؟

وودي يكون ملف مرتب يعني كل كلمة في عمود .......اتمنى وصلت الفكرة؟

#5

uppppppppppppppppppppp

#6

السلام عليكم ...

اقتباس
واريد كل كلمة تكون تحتها كلمات وهكدا منضم...شفت انو في داله justified بس ماعرفت كيف اسويها لكل سطر؟

فكري فيها كأنت تقومين بتصميم برنامج كـ Excel. مجموعة من الصفوف و الأعمدة. خلايا المصفوفة عبارة عن الكلمات, و أطول كلمة في كل عامود هي من يحدد طول الخلية. بالطبع نحتاج للمرور على جميع الكلمات في كل عمود و صف للحصول على أطول كلمة في كل عمود. ثم نقوم بعملية الإخراج بناء على طول أطول كلمة في كل عامود و نضيف الـ justification الإضافية التي نريدها. أنا أضفت مسافتين إضافيتين في لكل عمود. المشكلة أن الكود بـ ++C, لذلك حاولي أن تجدي طريقك فيه :)

#include <cstddef>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

// look down for what this function does!
bool words_count_comparator
	(const vector<string>& lhs, const vector<string>& rhs)
{ return lhs.size() < rhs.size(); }

int main()
{
	// get the unjustified text from input.txt,
	// and produce justified text in output.txt
	ifstream input("input.txt");
	ofstream output("output.txt", ios::out);
	// we store in words_matrix every word in every line alone.
	vector<vector<string>> words_matrix;
	// this will store how many characters we need in each column.
	vector<size_t> columns_justification;
	// used for extracting the lines and words out of raw text.
	string line, word;
	// get the longest line(words per line)
	size_t max_words_in_row;

	// extract words out of text.
	while( getline(input, line) )
	{
		vector<string> tokenized_line;
		stringstream line_tokenizer(line);
		while(  line_tokenizer >> word )
			tokenized_line.push_back(word);
		words_matrix.push_back(tokenized_line);
	}
	max_words_in_row = max_element
		(words_matrix.begin(), words_matrix.end(),
		words_count_comparator)->size();

	columns_justification.resize(max_words_in_row);
	for(size_t i = 0; i < words_matrix.size(); ++i)
		for(size_t j = 0; j < words_matrix.size(); ++j)
			columns_justification[j] = max
			(words_matrix[j].size(), columns_justification[j]);

	for(size_t i = 0; i < words_matrix.size(); ++i)
	{
		for(size_t j = 0; j < words_matrix.size(); ++j)
		{
			// print them with the specified justification for each column.
			// we added two spaces for each column as extra spaces.
			output << words_matrix[j] 
			       << string(columns_justification[j] - words_matrix[j].size()+2, ' ');
		}
		output << endl;
	}
}

المثال التي وضعتيه:

post-89451-074392100 1279233746_thumb.pn

بعد المرور على البرنامج:

post-89451-026849400 1279233752_thumb.pn

تحياتي...

المرفقات
before.pngafter.png
1
#7

كما قال خالد،

و هذه نسخة بايثونية .. لاحظ الفرق الشاسع بين الاناقة و التشابك!

maxes = {}
table = []
for line in open("input.txt"):
    parts = line.split()
    for index, part in enumerate(parts):
        maxes[index] = max(len(part), maxes.get(index,0))
    table.append(parts)
for row in table:
    for index, col in enumerate(row):
        print col.ljust(maxes.get(index) + 1),
    print

و هنا المدخلات و المخرجات:

hasenj ~/tmp   
$ cat input.txt 
AlAslAm   [AlAslAm]  a l a s l a m 
AlwHydyn   [AlwHydyn]  a l w h y d y n 
AtxAd   [AtxAd]  a t kh a d 
hm   [hm]  h m 
mnHhm   [mnHhm]  m n h h m 
qwp   [qwp]  q w pp 
ymlkwn   [ymlkwn]  y m l k w n 

hasenj ~/tmp   
$ python cols.py 
AlAslAm   [AlAslAm]   a  l  a   s  l  a  m 
AlwHydyn  [AlwHydyn]  a  l  w   h  y  d  y  n 
AtxAd     [AtxAd]     a  t  kh  a  d 
hm        [hm]        h  m 
mnHhm     [mnHhm]     m  n  h   h  m 
qwp       [qwp]       q  w  pp 
ymlkwn    [ymlkwn]    y  m  l   k  w  n

شيء من الشرح:

ljust ياخذ كلمة و يعملها left justify بمعنى يضيف مسافات لكي يجعل الكلمة تاخذ مساحة اضافية، بحسب البارامتر. مثلا:

"abc".ljust(6)

سيضيف مسافات لكي يكون طول النص 6 احرف (تخيل ان - هي مسافة) ستكون النتيجة:

abc---

بالنسبة لاطوال الخانات .. استخدمت dictionary لتخزين عرض كل عمود. في البداية فكرت في استخدام list و لكن لاحظت اننا لا نعرف كم عدد الاعمدة، لهذا استخدمت dictionary بدلا من ذلك (كان يمكن بسهولة ان استخدم list ايضا .. و لكن القلب و ما يهوى :lol: )

الدكشنري عنده خاصية get تسمح لنا بارجاع قيمة اصلية اذا لم يكن الـ key موجودا

مثلا الدكشنوي هذا فيه 'a' و 'b' و لكن ليس فيه 'c':

>>> d = {'a': 5, 'b': 10}
>>> d.get('a', 2)
5
>>> d.get('b', 2)
10
>>> d.get('c', 2)
2
>>>

الفنكشن max ياخذ متغيرين و يعطينا الاكبر منهم.

عن طريق جميع الفكرتين معا في سطر واحد ..

        maxes[index] = max(len(part), maxes.get(index,0))

ناخذ طول الكلمة الحالية

و اطول طول سابق سجلناه في العمود رقم index

و ناخذ الاكبر بينهما

و نسجله على انه اطول طول معروف لحد الان في العمود رقم index

تم تعديل هذه المشاركة بواسطة hasan_aljudy في 16 يوليو 2010 في 04:14

1
#8

أنا طلعت جاي أبيع الماء في حارة السقايين :lol:

أكيد يا حسن لا يمكن المقارنة بين Python و ++C في هذا النوع من البرامج, لأن Python أفضل بكل بساطة. عموماً, أنا لم أرد استخدام Boost, و إلا كان الكود سيصبح أفضل بكثير و أقرب لكود Python, و لكن ليس كثيراً :P

#9

مشكورين ماقصرتو

بشوف الكود وبطبقه

جزاكم الله عني كل الخير

مواضيع مشابهة