ملفات القيم المفصولة بفواصل (CSV) هي واحدة من أكثر التنسيقات شيوعًا للبيانات المصدرة. على Linux، يمكننا قراءة ملفات CSV باستخدام أوامر Bash. لكن الأمر قد يصبح معقدًا للغاية، وبسرعة كبيرة. سنقدم لك يد المساعدة.
ما هو ملف CSV؟
ملف القيم المفصولة بفواصل هو ملف نصي يحتوي على بيانات مجدولة. CSV هو نوع من البيانات المحددة. وكما يوحي الاسم، فإن ملف القيم المفصولة بفواصل هو ملف نصي يحتوي على بيانات مجدولة.,
“يتم استخدامه لفصل كل حقل من البيانات أو القيمة عن جيرانه.
إن ملفات CSV موجودة في كل مكان. فإذا كان التطبيق يحتوي على وظائف الاستيراد والتصدير، فسوف يدعم ملفات CSV دائمًا تقريبًا. كما أن ملفات CSV قابلة للقراءة بواسطة البشر. ويمكنك الاطلاع على محتوياتها بسهولة أكبر، وفتحها في أي محرر نصوص، ونقلها من برنامج إلى آخر. على سبيل المثال، يمكنك تصدير البيانات من قاعدة بيانات SQLite وفتحها في حاسبة ليبر أوفيس.
ومع ذلك، يمكن أن يصبح تنسيق CSV معقدًا أيضًا. هل تريد إضافة فاصلة في حقل بيانات؟ يجب أن يحتوي هذا الحقل على علامات اقتباس ”
"
“ملفوفة حولها. لتضمين علامات الاقتباس في حقل، يجب إدخال كل علامة اقتباس مرتين.
بالطبع، إذا كنت تعمل بملفات CSV التي تم إنشاؤها بواسطة برنامج أو نص برمجي كتبته بنفسك، فمن المرجح أن يكون تنسيق CSV بسيطًا ومباشرًا. إذا كنت مضطرًا للعمل بتنسيقات CSV أكثر تعقيدًا، نظرًا لكون Linux هو Linux، فهناك حلول يمكننا استخدامها لذلك أيضًا.
بعض البيانات النموذجية
يمكنك بسهولة إنشاء بعض بيانات CSV النموذجية، باستخدام مواقع مثل مولد البيانات عبر الإنترنتيمكنك تحديد الحقول التي تريدها واختيار عدد صفوف البيانات التي تريدها. يتم إنشاء بياناتك باستخدام قيم وهمية واقعية وتنزيلها على جهاز الكمبيوتر الخاص بك.
لقد أنشأنا ملفًا يحتوي على 50 سطرًا من معلومات الموظف الوهمية:
- بطاقة تعريف:قيمة عدد صحيح فريدة وبسيطة.
- الاسم الأول:الاسم الأول للشخص.
- اسم العائلة:اللقب للشخص.
- مسمى وظيفي:المسمى الوظيفي للشخص.
- عنوان البريد الإلكتروني:عنوان البريد الإلكتروني للشخص.
- فرع:فرع الشركة الذي يعملون فيه.
- ولاية:الولاية التي يقع فيها الفرع.
تحتوي بعض ملفات CSV على سطر رأسي يسرد أسماء الحقول. يحتوي ملف العينة لدينا على سطر رأسي. فيما يلي الجزء العلوي من ملفنا:
يحتوي السطر الأول على أسماء الحقول كقيم مفصولة بفاصلة.
تحليل البيانات من ملف CSV
دعنا نكتب نصًا برمجيًا يقرأ ملف CSV ويستخرج الحقول من كل سجل. انسخ هذا النص البرمجي إلى محرر، واحفظه في ملف يسمى “field.sh”.
#! /bin/bashwhile IFS="," read -r id firstname lastname jobtitle email branch state
do
echo "Record ID: $id"
echo "Firstname: $firstname"
echo " Lastname: $lastname"
echo "Job Title: $jobtitle"
echo "Email add: $email"
echo " Branch: $branch"
echo " State: $state"
echo ""
done < <(tail -n +2 sample.csv)
يوجد الكثير من الأشياء المضمنة في نصنا الصغير. دعنا نحللها.
نحن نستخدم while
حلقة. طالما أن while
يتم حل شرط الحلقة إلى true، ويتم تحويل نص الحلقة إلى while
سيتم تنفيذ الحلقة. جسم الحلقة بسيط للغاية. مجموعة من echo
يتم استخدام العبارات لطباعة قيم بعض المتغيرات على نافذة المحطة الطرفية.
ال while
إن شرط الحلقة أكثر إثارة للاهتمام من نص الحلقة. نحدد أنه يجب استخدام الفاصلة كفاصل داخلي للحقل، مع IFS=","
العبارة. IFS هو متغير بيئي. read
يشير الأمر إلى قيمته عند تحليل تسلسلات النص.
نحن نستخدم read
الأوامر -r
خيار (الاحتفاظ بالخطوط المائلة العكسية) لتجاهل أي خطوط مائلة عكسية قد تكون موجودة في البيانات. سيتم التعامل معها كأحرف عادية.
النص الذي read
يتم تخزين أوامر التحليل في مجموعة من المتغيرات المسماة على اسم حقول CSV. كان من الممكن بسهولة تسميتها field1, field2, ... field7
ولكن الأسماء ذات المعنى تجعل الحياة أسهل.
يتم الحصول على البيانات كمخرجات من tail
الأمر. نحن نستخدم tail
لأنه يمنحنا طريقة بسيطة لتخطي سطر العنوان في ملف CSV. -n +2
يخبرك خيار (رقم السطر) tail
للبدء بالقراءة من السطر رقم اثنين.
ال <(...)
يسمى البناء استبدال العمليةيؤدي هذا إلى جعل Bash يقبل مخرجات العملية كما لو كانت قادمة من موصوف ملف. ثم يتم إعادة توجيه هذا إلى while
حلقة، توفير النص الذي read
سيتم تحليل الأمر.
جعل البرنامج النصي قابلاً للتنفيذ باستخدام chmod
الأمر. ستحتاج إلى القيام بذلك في كل مرة تقوم فيها بنسخ نص برمجي من هذه المقالة. استبدل اسم النص البرمجي المناسب في كل حالة.
chmod +x field.sh
عندما نقوم بتشغيل البرنامج النصي، يتم تقسيم السجلات بشكل صحيح إلى الحقول المكونة لها، مع تخزين كل حقل في متغير مختلف.
./field.sh
يتم طباعة كل سجل كمجموعة من الحقول.
اختيار الحقول
ربما لا نريد أو نحتاج إلى استرداد كل حقل. يمكننا الحصول على مجموعة مختارة من الحقول من خلال دمج cut
يأمر.
يُسمى هذا البرنامج النصي “select.sh”.
#!/bin/bashwhile IFS="," read -r id jobtitle branch state
do
echo "Record ID: $id"
echo "Job Title: $jobtitle"
echo " Branch: $branch"
echo " State: $state"
echo ""
done < <(cut -d "," -f1,4,6,7 sample.csv | tail -n +2)
لقد أضفنا cut
الأمر في جملة استبدال العملية. نحن نستخدم -d
(الفاصل) خيار لإخبار cut
“استخدام الفواصل”,
“كفاصل. -f
يخبرك خيار (الحقل) cut
نريد الحقول واحد وأربعة وستة وسبعة. تتم قراءة هذه الحقول الأربعة في أربعة متغيرات، والتي يتم طباعتها في نص while
حلقة.
هذا ما نحصل عليه عندما نقوم بتشغيل البرنامج النصي.
./select.sh
عن طريق إضافة cut
باستخدام الأمر، نتمكن من تحديد الحقول التي نريدها وتجاهل تلك التي لا نريدها.
حتى الآن، الأمور جيدة. ولكن…
إذا كان ملف CSV الذي تتعامل معه غير معقد ولا يحتوي على فواصل أو علامات اقتباس في بيانات الحقل، فمن المحتمل أن يلبي ما قمنا بتغطيته احتياجاتك في تحليل ملفات CSV. ولإظهار المشكلات التي قد نواجهها، قمنا بتعديل عينة صغيرة من البيانات لتبدو بهذا الشكل.
id,firstname,lastname,job-title,email-address,branch,state1,Rosalyn,Brennan,"Steward, Senior",Rosalyn_Brennan4351@mafthy.com,Minneapolis,Maryland
2,Danny,Redden,"Analyst ""Budget""",Danny_Redden1443@brety.org,Venice,North Carolina
3,Lexi,Roscoe,Pharmacist,,Irlington,Vermont
- السجل الأول يحتوي على فاصلة في
job-title
الحقل، لذا يجب أن يتم وضع الحقل بين علامتي الاقتباس. - يحتوي السجل الثاني على كلمة محاطة بمجموعتين من علامات الاقتباس في
jobs-title
مجال. - السجل الثالث لا يحتوي على أي بيانات في
email-address
مجال.
تم حفظ هذه البيانات باسم “sample2.csv”. عدّل البرنامج النصي “field.sh” الخاص بك لاستدعاء “sample2.csv”، ثم احفظه باسم “field2.sh”.
#! /bin/bashwhile IFS="," read -r id firstname lastname jobtitle email branch state
do
echo "Record ID: $id"
echo "Firstname: $firstname"
echo " Lastname: $lastname"
echo "Job Title: $jobtitle"
echo "Email add: $email"
echo " Branch: $branch"
echo " State: $state"
echo ""
done < <(tail -n +2 sample2.csv)
عندما نقوم بتشغيل هذا البرنامج النصي، يمكننا رؤية الشقوق التي تظهر في محللات CSV البسيطة لدينا.
./field2.sh
يقسم السجل الأول حقل عنوان الوظيفة إلى حقلين، ويعامل الجزء الثاني باعتباره عنوان البريد الإلكتروني. يتم نقل كل حقل بعد ذلك بمقدار مكان واحد إلى اليمين. يحتوي الحقل الأخير على كل من branch
و ال state
قيم.
يحتفظ السجل الثاني بكل علامات الاقتباس. يجب أن يحتوي السجل الثاني على زوج واحد فقط من علامات الاقتباس حول كلمة “الميزانية”.
في الواقع، يتعامل السجل الثالث مع الحقل المفقود كما ينبغي. عنوان البريد الإلكتروني مفقود، ولكن كل شيء آخر كما ينبغي.
على عكس المتوقع، بالنسبة لتنسيق بيانات بسيط، من الصعب جدًا كتابة محلل CSV قوي للحالات العامة. أدوات مثل awk
سيسمح لك بالاقتراب، ولكن هناك دائمًا حالات حافة واستثناءات تفلت منا.
ربما لا تكون محاولة كتابة محلل CSV معصومًا من الخطأ هي الطريقة الأفضل للمضي قدمًا. هناك نهج بديل ــ وخاصة إذا كنت تعمل وفقًا لموعد نهائي من نوع ما ــ يستخدم استراتيجيتين مختلفتين.
الطريقة الأولى هي استخدام أداة مصممة خصيصًا لمعالجة بياناتك واستخراجها. الطريقة الثانية هي تطهير بياناتك واستبدال سيناريوهات المشاكل مثل الفواصل المضمنة وعلامات الاقتباس. بعد ذلك، يمكن لمحللات Bash البسيطة الخاصة بك التعامل مع ملف CSV الصديق لـ Bash.
مجموعة أدوات CSV csvkit
هي مجموعة من الأدوات المساعدة التي تم إنشاؤها خصيصًا للمساعدة في العمل مع ملفات CSV. ستحتاج إلى تثبيتها على جهاز الكمبيوتر الخاص بك.
لتثبيته على أوبونتو، استخدم هذا الأمر:
sudo apt install csvkit
لتثبيته على فيدورا، تحتاج إلى كتابة:
sudo dnf install python3-csvkit
في Manjaro الأمر هو:
sudo pacman -S csvkit
إذا مررنا اسم ملف CSV إليه، csvlook
تعرض الأداة المساعدة جدولاً يوضح محتويات كل حقل. يتم عرض محتوى الحقل لإظهار ما يمثله محتوى الحقل، وليس كما يتم تخزينه في ملف CSV.
دعونا نحاول csvlook
مع ملفنا “sample2.csv” المشكل.
csvlook sample2.csv
يتم عرض جميع الحقول بشكل صحيح. وهذا يثبت أن المشكلة لا تكمن في ملف CSV. المشكلة هي أن نصوصنا مبسطة للغاية بحيث لا يمكنها تفسير ملف CSV بشكل صحيح.
لتحديد أعمدة محددة، استخدم csvcut
الأمر. -c
يمكن استخدام الخيار (العمود) مع أسماء الحقول أو أرقام الأعمدة، أو مزيج من الاثنين.
لنفترض أننا بحاجة إلى استخراج الاسم الأول والأخير والمسميات الوظيفية وعناوين البريد الإلكتروني من كل سجل، ولكننا نريد ترتيب الأسماء على النحو التالي “الاسم الأخير، الاسم الأول”. كل ما نحتاج إلى فعله هو وضع أسماء الحقول أو الأرقام بالترتيب الذي نريده.
هذه الأوامر الثلاثة كلها متكافئة.
csvcut -c lastname,firstname,job-title,email-address sample2.csv
csvcut -c lastname,firstname,4,5 sample2.csv
csvcut -c 3,2,4,5 sample2.csv
يمكننا أن نضيف csvsort
أمر لفرز النتائج حسب الحقل. نحن نستخدم -c
خيار (العمود) لتحديد العمود الذي سيتم الفرز حسبه، و -r
(عكس) خيار لفرز حسب الترتيب التنازلي.
csvcut -c 3,2,4,5 sample2.csv | csvsort -c 1 -r
لجعل الناتج أجمل يمكننا تغذيته من خلال csvlook
.
csvcut -c 3,2,4,5 sample2.csv | csvsort -c 1 -r | csvlook
من اللمسات الأنيقة أنه على الرغم من فرز السجلات، يتم الاحتفاظ بسطر العنوان الذي يحتوي على أسماء الحقول باعتباره السطر الأول. بمجرد أن نكون سعداء بأن لدينا البيانات بالطريقة التي نريدها، يمكننا إزالة csvlook
من سلسلة الأوامر، وإنشاء ملف CSV جديد عن طريق إعادة توجيه الإخراج إلى ملف.
لقد أضفنا المزيد من البيانات إلى “sample2.file”، وقمنا بإزالة csvsort
الأمر، وقمت بإنشاء ملف جديد يسمى “sample3.csv”.
csvcut -c 3,2,4,5 sample2.csv > sample3.csv
طريقة آمنة لتطهير بيانات CSV
إذا قمت بفتح ملف CSV في LibreOffice Calc، فسيتم وضع كل حقل في خلية. يمكنك استخدام وظيفة البحث والاستبدال للبحث عن الفواصل. يمكنك استبدالها بـ “لا شيء” حتى تختفي، أو بحرف لن يؤثر على تحليل CSV، مثل الفاصلة المنقوطة “;
” على سبيل المثال.
لن ترى علامات الاقتباس حول الحقول المقتبسة. علامات الاقتباس الوحيدة التي ستراها هي علامات الاقتباس المضمنة داخل بيانات الحقل. يتم عرضها كعلامات اقتباس مفردة. العثور على هذه واستبدالها بعلامة اقتباس مفردة “'
“سيتم استبدال علامات الاقتباس المزدوجة في ملف CSV.
إن إجراء البحث والاستبدال في تطبيق مثل LibreOffice Calc يعني أنه لا يمكنك حذف أي من فواصل الحقول عن طريق الخطأ، ولا يمكنك حذف علامات الاقتباس حول الحقول المقتبسة. لن تغير سوى قيم البيانات للحقول.
لقد قمنا بتغيير جميع الفواصل في الحقول بفاصلات منقوطة وجميع علامات الاقتباس المضمنة بعلامات اقتباس أحادية وحفظنا التغييرات التي أجريناها.
ثم قمنا بإنشاء برنامج نصي يسمى “field3.sh” لتحليل “sample3.csv”.
#! /bin/bashwhile IFS="," read -r lastname firstname jobtitle email
do
echo " Lastname: $lastname"
echo "Firstname: $firstname"
echo "Job Title: $jobtitle"
echo "Email add: $email"
echo ""
done < <(tail -n +2 sample3.csv)
دعونا نرى ما نحصل عليه عندما نقوم بتشغيله.
./field3.sh
يمكن الآن لمحللنا البسيط التعامل مع سجلاتنا التي كانت تسبب لنا مشاكل في السابق.
ستشاهد عددًا كبيرًا من ملفات CSV
يمكن القول إن CSV هو أقرب شيء إلى لغة مشتركة لبيانات التطبيق. تدعم معظم التطبيقات التي تتعامل مع بعض أشكال البيانات استيراد وتصدير CSV. إن معرفة كيفية التعامل مع CSV بطريقة واقعية وعملية سوف تساعدك كثيرًا.