سيد استيراد-Csv وأوامر CSV الأخرى في PowerShell

يتيح لك cmdlet Export-Csv في PowerShell و cmdlet Import-Csv في PowerShell للمسؤولين استيراد ملفات CSV عبر حلقة foreach، استخدم Export-Csv لإلحاق ملفات CSV وتصدير مصفوفات إلى ملف CSV والكثير غير ذلك.

في هذا المقال، ستتعلم حول العديد من السيناريوهات الشائعة التي يمكنك استخدام PowerShell لإدارة ملفات CSV مثل:

  • قراءة ملفات CSV باستخدام PowerShell
  • حفظ ملفات CSV باستخدام PowerShell
  • تنسيق الإخراج قبل تشغيل Export-CSV
  • إلحاق بملف CSV
  • إلحاق الفروق بملف موجود
  • Export-CSV وسلسلة #TYPE

إذا لم تكن على دراية بكيفية عمل ملفات CSV من الداخل، فهي ملفات نصية تتبع تنسيقًا قياسيًا لفصل القيم بفواصل عند إنشاء جدول. يمكنك إنشاء ملف CSV في PowerShell باستخدام cmdlet Export-Csv وتوجيه كائن أو أكثر إليه.

الأمر أدناه يجد أول عمليتين قيد التشغيل ويمرر الكائنات الناتجة إلى cmdlet Export-Csv. يقوم cmdlet Export-Csv بإنشاء ملف CSV بالاسم processes.csv في جذر محرك النظام الخاص بك (على الأرجح C:\).

PS51> Get-Process | Select-Object -First 2 | Export-CSV -Path "$env:SystemDrive\processes.csv"

الآن افتح processes.csv باستخدام Notepad. يجب أن ترى "Name","SI","Handles","VM" في الأعلى كرؤوس. سترى أيضًا #TYPE System.Diagnostics.Process، والذي قد لا يكون منطقيًا الآن. لا تقلق، سنغطي هذه السلسلة في هذا المقال.

قراءة ملفات CSV باستخدام Import-Csv

هل ترغب في المزيد من النصائح مثل هذه؟ تحقق من مدونتي الشخصية حول PowerShell.

PowerShell لديها بعض الأوامر التي تسمح لك بقراءة ملفات النص. تلك الأوامر هي Get-Content و Import-Csv. يقرأ كل من هذين الأمرين بشكل فني الملف بنفس الطريقة. ولكن Import-Csv تأخذ خطوة إضافية. Import-Csv تفهم الهيكل الأساسي ليس فقط ملف نص ولكن ملف CSV.

نظرًا لأن ملف CSV يتبع مخططًا معينًا، يفهم Import-Csv مخطط CSV. هذا الأمر لا يقرأ فقط ملف النص من القرص ولكنه أيضًا يحول الصفوف في ملف CSV إلى كائنات PowerShell.

ملفات غير CSV

عادةً ما يكون بيانات CSV منفصلة بواسطة فاصلة ولكن هناك أوقات تكون فيها بيانات CSV (ليست تقنيًا CSV في تلك اللحظة) منفصلة بواسطة فاصل مختلف. يكون هذا الفاصل في بعض الأحيان عبارة عن مسافة تابعة أو ربما فاصلة منقوطة.

إذا كان لديك ملف CSV بفاصل مختلف، يمكنك استخدام معلمة Delimiter. تُخبر هذه المعلمة Import-Csv بعدم البحث عن الفواصل، التي يفعلها بشكل افتراضي باستخدام الفواصل العادية، بل بقيمة أخرى.

على سبيل المثال، إذا كان لديك ملف مفصول بواسطة الأقواس، يمكنك قراءة الملف كما يلي:

PS51> Import-Csv -Path tab-separated-data.csv -Delimiter "`t"

إضافة الرؤوس

A common Import-Csv parameter is Header. This parameter lets you specify the property names of the objects created by this cmdlet.

بشكل افتراضي، سيتعامل الأمر Import-Csv مع الصف الأول في ملف CSV كرؤوس. ثم سيحول هذه القيم إلى خصائص لكل صف (كائن). ولكن إذا كان لديك ملف CSV لا يحتوي على صف رئيسي، يمكنك استخدام معلمة Header لتعريف واحد بنفسك.

تمنع المعلمة Header استخدام Import-CSV لصفك الأول كرأس، وتوفر لك أيضًا عناء فتح ملف CSV يدويًا لإضافة رؤوس بنفسك.

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

a,1
b,2
c,3

احفظ ملف النص كـ test.csv. لا تنس تمكين ملحقات نوع الملف أو إطار الملف بعلامات اقتباس مزدوجة حتى لا تقوم بحفظه عن طريق الخطأ باسم ينتهي بـ .csv.txt!

الآن، استخدم Import-CSV لقراءة ملف CSV الذي تم إنشاؤه مؤخرًا بدون معلمة Header وافحص الناتج.

PS51> Import-Csv .\test.csv

a 1
---
b 2
c 3

لاحظ أنه تم استخدام الصف الأول كخصائص الكائن. A و 1 ليست “تسميات” ترغب فيها لخصائص الكائن. A و b و c هي أحرف بينما 1 و 2 و 3 هي أرقام. تحتاج إلى تعريف هذه باستخدام معلمة Header كما هو موضح أدناه:

PS51> Import-Csv .\test.csv -Header "Letter", "Number"

Letter Number
------ ------
a      1
b      2
c      3

حفظ ملفات CSV باستخدام PowerShell

إذا كنت بحاجة إلى إنشاء أو حفظ ملف CSV من كائنات PowerShell ، يمكنك الذهاب أيضًا في الاتجاه الآخر. بينما تحول أدوات الأمر Import-Csv ملف CSV إلى كائنات PowerShell ، فإن Export-Csv يقوم بالعكس. تقوم هذه الأداة بـ “تحويل” كائنات PowerShell إلى ملف CSV.

بحفظ ملف CSV بواسطة Export-Csv يسمح لك بعرض أو استخدام تلك البيانات في أنظمة أخرى في وقت لاحق.

على سبيل المثال ، يمكنني حفظ جميع العمليات الجارية على جهاز الكمبيوتر الخاص بي عن طريق توجيه Get-Process إلى أداة الأمر Export-Csv.

PS51> Get-Process | Export-Csv -Path processes.csv

أمر Export-Csv بسيط بطبيعته ولكن هناك بعض الأمور التي يجب أن تكون متيقظًا من أجلها.

تنسيق الإخراج قبل تشغيل الأمر Export-CSV

كما رأيت أعلاه ، يقوم Export-Csv بحد ذاته بتحويل “خام”. لا يضيف أي تنسيق نص متميز ، ولا يضيف أي ألوان وما إلى ذلك.

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

يمكنك فتح ملف CSV في برنامج Microsoft Excel وتغيير النص إلى خط عريض، وتطبيق تنسيقات الألوان والعديد من الأشياء الأخرى، ولكن إذا قمت بحفظ الملف كملف CSV (بدلاً من مصنف Excel)، فسيتم مسح جميع التنسيقات. فملف CSV ببساطة ليس “ذكيًا” بما فيه الكفاية.

تذكر أن ملفات CSV هي مجرد ملفات نصية عادية تحتوي على قيم محددة بفواصل (أو أحيانًا علامات تبويب). سيكون استخدام أمر Import-Csv مع أي أمر برمجة سكريبتية PowerShell من نوع Format-* غير مجدي.

وفقًا لـ وثائق Microsoft Export-Csv: “لا تقم بتنسيق الكائنات قبل إرسالها إلى أمر Export-CSV. إذا تلقى أمر Export-CSV كائنات مُنسّقة، ستحتوي ملف CSV على خصائص التنسيق بدلاً من خصائص الكائن.”.

لماذا يحدث هذا؟

افتح نافذة PowerShell وأنشئ بعض البيانات الوهمية. دعنا نستخدم مثال Get-Process الذي تم تغطيته في الجزء الأول من هذه المقالة. ولكن هذه المرة، قم بتخزين الناتج في متغير. ثم، قم بتوصيل هذه الكائنات المعالجة إلى أمر Format-Table.

PS51> $a = Get-Process
PS51> $a | Format-Table
Using Format-Table

يمكنك أن ترى أنه باستخدام أمر Format-Table، يمكنك الحصول على ناتج نظيف وجدولي.

الآن احفظ هذا الناتج في متغير آخر.

PS51> $b = $a | Format-Table

ثم عرض الخصائص في قيم المتغيرين $a و $b باستخدام الأمر Get-Member. سيساعدك هذا الأمر في فهم سبب عدم تصدير هاتين الكائنتين المشابهتين بنفس الطريقة إلى ملف CSV.

PS51> $a | Get-Member
System.Diagnostics.Process object type
PS51> $b | Get-Member
Format-Table‘s many object types

الإخراج المباشر من Get-Process يعيد: TypeName: System.Diagnostics.Process في حين يكون الإخراج من Format-Table مختلفًا تمامًا. يعيد العديد من أنواع مختلفة بخصائص متنوعة.

إذا قمت بعرض $a و $b في وحدة التحكم، سيكون الإخراج متطابقًا. يعود هذا السلوك إلى نظام تنسيق PowerShell.

كيف يؤثر هذا على إخراج Export-Csv?

PS51> $b | Export-Csv | Format-Table

Export-Csv يقرأ كل كائن كما هو. عند توجيه الإخراج إلى cmdlet Format-*، فإنك تقوم بتغيير الإدخال الذي يتلقاه Export-CSV. وهذا يؤثر بدوره على الإخراج الذي يتم حفظه في ملف CSV الجديد الخاص بك.

إذا كنت ستقوم بتوجيه الإخراج إلى cmdlet Export-Csv، فلا تقوم بتوجيه الإخراج إلى أي cmdlet Format-*.

تذكر أن ملفات CSV مركزة على البيانات، وليس على التنسيق.

إضافة إلى ملف CSV

في بعض الأحيان قد تكون لديك ملف موجود ترغب في إضافة البيانات إليه بدلاً من إنشاء واحد جديد بالكامل. بشكل افتراضي، سيقوم Export-Csv بالكتابة فوق أي ملف يتم تحديده عبر معلمة Path.

إذا كنت بحاجة إلى إضافة بيانات إلى CSV، استخدم معلمة Append.

لنقل أن لديك حلقة تكرار تريد فيها حفظ كل كائن معالج في ملف CSV. في كل تكرار، لديك كائن مختلف ترغب في حفظه في ملف CSV. نظرًا لأنك تستدعي \code{Export-Csv} مرارًا وتكرارًا، فسيقوم بالكتابة فوق ملف CSV ذلك إذا لم تستخدم معلمة \code{Append}. بدون معلمة \code{Append}، ستحصل فقط على الكائن الأخير، والذي في معظم الحالات ليس الناتج المرغوب فيه.

المثال أدناه يبحث عن أول خمسة عمليات قيد التشغيل. ثم يدخل في حلقة \code{foreach} في PowerShell ويسجل خصائص \code{Name} و \code{ProductVersion} إلى ملف \diy5{test.csv} واحد تلو الآخر.

Get-Process | Select-Object -First 5 | Foreach-Object {
    $_ | Select-Object Name, ProductVersion | Export-CSV -Path C:\test.csv -Append
}

بدون استخدام معلمة \code{Append}، سترى أنه فقط العملية الخامسة ستظهر في ملف CSV.

إضافة الاختلافات إلى ملف CSV

من الممكن إضافة فقط اختلافات الخصائص إلى ملف CSV موجود باستخدام \code{Export-Csv}. وهذا يعني أنه إذا كانت أعمدة صف CSV والكائن المراد تسجيله مختلفين، فقم بإضافتهما.

لإضافة فقط الاختلافات إلى ملف CSV، ستحتاج إلى استخدام معلمتي \code{Append} و \code{Force} معًا. وفقًا لتوثيق Microsoft “عندما يتم دمج معلمتي \code{Force} و \code{Append}، يمكن كتابة كائنات تحتوي على خصائص غير متطابقة إلى ملف CSV. يتم كتابة الخصائص المتطابقة فقط إلى الملف. تُتجاهل الخصائص غير المتطابقة.”

لتوضيح، قم بإنشاء كائن يحتوي على خاصيتين؛ Name و Age.

PS51> $Content = [PSCustomObject]@{Name = "Johnny"; Age = "18"}

الآن، قم بإنشاء كائن آخر يحتوي على خاصية Name و Zip.

PS51> $OtherContent = [PSCustomObject]@{Name = "Joe"; Zip = "02195"}

كل كائن لديه خصائص مختلفة.

بعد ذلك، قم بإنشاء ملف CSV من الكائن الأول ثم حاول إلحاق الكائن الثاني بالملف CSV بدون استخدام معلمة Force. ستتلقى خطأ.

PS51> $Content | Export-CSV -Path .\User.csv -NoTypeInformation
PS51> $OtherContent | Export-CSV -Path .\User.csv -NoTypeInformation -Append
Export-Csv without Force

ومع ذلك، إذا استخدمت معلمة Force، ستعمل Export-Csv بشكل جيد.

PS51> $OtherContent | Export-CSV -Path .\User.csv -NoTypeInformation -Append -Force

ومع ذلك، ستلاحظ أن عمود Zip قد اختفى في ملف CSV. استخدم Force بحذر. قد لا يقدم النتائج المقصودة.

PS51> Import-Csv -Path .\User.csv

Name   Age
----   ---
Johnny 18
Joe

Export-CSV وسلسلة #TYPE

بشكل افتراضي، عند استخدام Export-CSV بدون معلمات إضافية، سيتم تضمين سلسلة #TYPE في أعلى ملف CSV الخاص بك. يتبع هذه السلسلة نوع الكائن الذي تلقاه Export-Csv.

 #TYPE System.Diagnostics.Process 

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

لإزالة هذه السلسلة، استخدم معلمة NoTypeInformation. تقوم هذه المعلمة بإزالة هذه السلسلة تمامًا من ملف CSV.

لاحظ أنه بدءًا من PowerShell Core، لم يعد ذلك ضروريًا.

الملخص

استخدام سطر الأوامر Import-CSV و Export-CSV في PowerShell يتيح لك العمل بسهولة مع ملفات CSV. هذه هي اثنين من سطور الأوامر المفيدة التي يجب عليك استخدامها بانتظام عند التعامل مع الكائنات وملفات CSV.

أملي أن مع الشروحات والأمثلة التي عرضتها هنا يمكنك أن تحصل على فهم واضح للحالات التي يمكنك فيها استغلال هذه السطور الأوامر لصالحك.

ترغب في المزيد من النصائح مثل هذه؟ تفقد مدونتي الشخصية لـ PowerShell هنا.

Source:
https://adamtheautomator.com/import-csv/