كيفية تحليل بيانات CSV في Bash

ملفات القيم المفصولة بفواصل (CSV) هي واحدة من أكثر التنسيقات شيوعًا للبيانات المصدرة. على Linux، يمكننا قراءة ملفات CSV باستخدام أوامر Bash. لكن الأمر قد يصبح معقدًا للغاية، وبسرعة كبيرة. سنقدم لك يد المساعدة.




ما هو ملف CSV؟

ملف القيم المفصولة بفواصل هو ملف نصي يحتوي على بيانات مجدولة. CSV هو نوع من البيانات المحددة. وكما يوحي الاسم، فإن ملف القيم المفصولة بفواصل هو ملف نصي يحتوي على بيانات مجدولة.,“يتم استخدامه لفصل كل حقل من البيانات أو القيمة عن جيرانه.

ذات صلة: ما هو ملف CSV، وكيف يمكنني فتحه؟

إن ملفات CSV موجودة في كل مكان. فإذا كان التطبيق يحتوي على وظائف الاستيراد والتصدير، فسوف يدعم ملفات CSV دائمًا تقريبًا. كما أن ملفات CSV قابلة للقراءة بواسطة البشر. ويمكنك الاطلاع على محتوياتها بسهولة أكبر، وفتحها في أي محرر نصوص، ونقلها من برنامج إلى آخر. على سبيل المثال، يمكنك تصدير البيانات من قاعدة بيانات SQLite وفتحها في حاسبة ليبر أوفيس.

ومع ذلك، يمكن أن يصبح تنسيق CSV معقدًا أيضًا. هل تريد إضافة فاصلة في حقل بيانات؟ يجب أن يحتوي هذا الحقل على علامات اقتباس ”

" 

“ملفوفة حولها. لتضمين علامات الاقتباس في حقل، يجب إدخال كل علامة اقتباس مرتين.


بالطبع، إذا كنت تعمل بملفات CSV التي تم إنشاؤها بواسطة برنامج أو نص برمجي كتبته بنفسك، فمن المرجح أن يكون تنسيق CSV بسيطًا ومباشرًا. إذا كنت مضطرًا للعمل بتنسيقات CSV أكثر تعقيدًا، نظرًا لكون Linux هو Linux، فهناك حلول يمكننا استخدامها لذلك أيضًا.

بعض البيانات النموذجية

يمكنك بسهولة إنشاء بعض بيانات CSV النموذجية، باستخدام مواقع مثل مولد البيانات عبر الإنترنتيمكنك تحديد الحقول التي تريدها واختيار عدد صفوف البيانات التي تريدها. يتم إنشاء بياناتك باستخدام قيم وهمية واقعية وتنزيلها على جهاز الكمبيوتر الخاص بك.

لقد أنشأنا ملفًا يحتوي على 50 سطرًا من معلومات الموظف الوهمية:

  • بطاقة تعريف:قيمة عدد صحيح فريدة وبسيطة.
  • الاسم الأول:الاسم الأول للشخص.
  • اسم العائلة:اللقب للشخص.
  • مسمى وظيفي:المسمى الوظيفي للشخص.
  • عنوان البريد الإلكتروني:عنوان البريد الإلكتروني للشخص.
  • فرع:فرع الشركة الذي يعملون فيه.
  • ولاية:الولاية التي يقع فيها الفرع.

تحتوي بعض ملفات CSV على سطر رأسي يسرد أسماء الحقول. يحتوي ملف العينة لدينا على سطر رأسي. فيما يلي الجزء العلوي من ملفنا:


ملف CSV العينة

يحتوي السطر الأول على أسماء الحقول كقيم مفصولة بفاصلة.

تحليل البيانات من ملف CSV

دعنا نكتب نصًا برمجيًا يقرأ ملف CSV ويستخرج الحقول من كل سجل. انسخ هذا النص البرمجي إلى محرر، واحفظه في ملف يسمى “field.sh”.

#! /bin/bash 

while 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)

يوجد الكثير من الأشياء المضمنة في نصنا الصغير. دعنا نحللها.


ذات صلة: كيفية معالجة ملف سطرًا بسطر في نص Bash لنظام Linux

نحن نستخدم 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

جعل البرنامج النصي قابلاً للتنفيذ باستخدام chmod


عندما نقوم بتشغيل البرنامج النصي، يتم تقسيم السجلات بشكل صحيح إلى الحقول المكونة لها، مع تخزين كل حقل في متغير مختلف.

./field.sh

ملف CSV تم تحليله بواسطة البرنامج النصي field.sh.

يتم طباعة كل سجل كمجموعة من الحقول.

اختيار الحقول

ربما لا نريد أو نحتاج إلى استرداد كل حقل. يمكننا الحصول على مجموعة مختارة من الحقول من خلال دمج cut يأمر.

يُسمى هذا البرنامج النصي “select.sh”.

#!/bin/bash 

while 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

تحليل ملف CSV باستخدام field.sh لاستخراج مجموعة محددة من الحقول

عن طريق إضافة cut باستخدام الأمر، نتمكن من تحديد الحقول التي نريدها وتجاهل تلك التي لا نريدها.

حتى الآن، الأمور جيدة. ولكن…

إذا كان ملف CSV الذي تتعامل معه غير معقد ولا يحتوي على فواصل أو علامات اقتباس في بيانات الحقل، فمن المحتمل أن يلبي ما قمنا بتغطيته احتياجاتك في تحليل ملفات CSV. ولإظهار المشكلات التي قد نواجهها، قمنا بتعديل عينة صغيرة من البيانات لتبدو بهذا الشكل.


id,firstname,lastname,job-title,email-address,branch,state 

1,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/bash 

while 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

تشغيل field2.sh

يقسم السجل الأول حقل عنوان الوظيفة إلى حقلين، ويعامل الجزء الثاني باعتباره عنوان البريد الإلكتروني. يتم نقل كل حقل بعد ذلك بمقدار مكان واحد إلى اليمين. يحتوي الحقل الأخير على كل من branch و ال state قيم.

سجل يحتوي على حقل مقسم إلى حقلين


يحتفظ السجل الثاني بكل علامات الاقتباس. يجب أن يحتوي السجل الثاني على زوج واحد فقط من علامات الاقتباس حول كلمة “الميزانية”.

سجل يحتوي على علامات اقتباس تم التعامل معها بشكل خاطئ

في الواقع، يتعامل السجل الثالث مع الحقل المفقود كما ينبغي. عنوان البريد الإلكتروني مفقود، ولكن كل شيء آخر كما ينبغي.

سجل يحتوي على حقل مفقود، والذي يتم التعامل معه بشكل صحيح

على عكس المتوقع، بالنسبة لتنسيق بيانات بسيط، من الصعب جدًا كتابة محلل CSV قوي للحالات العامة. أدوات مثل awk سيسمح لك بالاقتراب، ولكن هناك دائمًا حالات حافة واستثناءات تفلت منا.


ذات صلة: كيفية استخدام الأمر awk على Linux

ربما لا تكون محاولة كتابة محلل CSV معصومًا من الخطأ هي الطريقة الأفضل للمضي قدمًا. هناك نهج بديل ــ وخاصة إذا كنت تعمل وفقًا لموعد نهائي من نوع ما ــ يستخدم استراتيجيتين مختلفتين.

الطريقة الأولى هي استخدام أداة مصممة خصيصًا لمعالجة بياناتك واستخراجها. الطريقة الثانية هي تطهير بياناتك واستبدال سيناريوهات المشاكل مثل الفواصل المضمنة وعلامات الاقتباس. بعد ذلك، يمكن لمحللات Bash البسيطة الخاصة بك التعامل مع ملف CSV الصديق لـ Bash.

مجموعة أدوات CSV csvkit هي مجموعة من الأدوات المساعدة التي تم إنشاؤها خصيصًا للمساعدة في العمل مع ملفات CSV. ستحتاج إلى تثبيتها على جهاز الكمبيوتر الخاص بك.

لتثبيته على أوبونتو، استخدم هذا الأمر:

sudo apt install csvkit

تثبيت csvkit على أوبونتو


لتثبيته على فيدورا، تحتاج إلى كتابة:

sudo dnf install python3-csvkit

تثبيت csvkit على فيدورا

في Manjaro الأمر هو:

sudo pacman -S csvkit

تثبيت csvkit على Manjaro

إذا مررنا اسم ملف CSV إليه، csvlook تعرض الأداة المساعدة جدولاً يوضح محتويات كل حقل. يتم عرض محتوى الحقل لإظهار ما يمثله محتوى الحقل، وليس كما يتم تخزينه في ملف CSV.

دعونا نحاول csvlook مع ملفنا “sample2.csv” المشكل.


csvlook sample2.csv

ملف CSV مزعج تم تحليله بشكل صحيح بواسطة csvlook

يتم عرض جميع الحقول بشكل صحيح. وهذا يثبت أن المشكلة لا تكمن في ملف 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

اختيار الحقول بالترتيب المفضل باستخدام csvcut

يمكننا أن نضيف 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 لطباعة مجموعة الحقول المفرزة بشكل جميل

من اللمسات الأنيقة أنه على الرغم من فرز السجلات، يتم الاحتفاظ بسطر العنوان الذي يحتوي على أسماء الحقول باعتباره السطر الأول. بمجرد أن نكون سعداء بأن لدينا البيانات بالطريقة التي نريدها، يمكننا إزالة csvlook من سلسلة الأوامر، وإنشاء ملف CSV جديد عن طريق إعادة توجيه الإخراج إلى ملف.

لقد أضفنا المزيد من البيانات إلى “sample2.file”، وقمنا بإزالة csvsort الأمر، وقمت بإنشاء ملف جديد يسمى “sample3.csv”.

csvcut -c 3,2,4,5 sample2.csv > sample3.csv

إعادة توجيه csvcut لإنشاء ملف جديد يسمى sample3.csv


طريقة آمنة لتطهير بيانات CSV

إذا قمت بفتح ملف CSV في LibreOffice Calc، فسيتم وضع كل حقل في خلية. يمكنك استخدام وظيفة البحث والاستبدال للبحث عن الفواصل. يمكنك استبدالها بـ “لا شيء” حتى تختفي، أو بحرف لن يؤثر على تحليل CSV، مثل الفاصلة المنقوطة “;” على سبيل المثال.

لن ترى علامات الاقتباس حول الحقول المقتبسة. علامات الاقتباس الوحيدة التي ستراها هي علامات الاقتباس المضمنة داخل بيانات الحقل. يتم عرضها كعلامات اقتباس مفردة. العثور على هذه واستبدالها بعلامة اقتباس مفردة “'“سيتم استبدال علامات الاقتباس المزدوجة في ملف CSV.

استخدام ميزة البحث والاستبدال في LibreOffice Calc لاستبدال علامات الاقتباس بعلامات اقتباس


إن إجراء البحث والاستبدال في تطبيق مثل LibreOffice Calc يعني أنه لا يمكنك حذف أي من فواصل الحقول عن طريق الخطأ، ولا يمكنك حذف علامات الاقتباس حول الحقول المقتبسة. لن تغير سوى قيم البيانات للحقول.

لقد قمنا بتغيير جميع الفواصل في الحقول بفاصلات منقوطة وجميع علامات الاقتباس المضمنة بعلامات اقتباس أحادية وحفظنا التغييرات التي أجريناها.

ملف CSV المعدل

ثم قمنا بإنشاء برنامج نصي يسمى “field3.sh” لتحليل “sample3.csv”.

#! /bin/bash 

while 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. إن معرفة كيفية التعامل مع CSV بطريقة واقعية وعملية سوف تساعدك كثيرًا.

ذات صلة: 9 أمثلة لنصوص Bash لمساعدتك على البدء في استخدام Linux

أضف تعليق