مشخصات مقاله
ادغام چند CSV با استفاده از PowerShell-آموزش ادغام چند CSV با سربرگ (Header) یکسان
کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.
ادغام چند فایل CSV با هدر یکسان با استفاده از PowerShell
اخیراً بر روی eRoom برای مهاجرت از SharePoint با کمک Metalogix کار می کنم. کنسول Metalogix eRoom پیش از مهاجرت، موضوعات ممکن برای مهاجرت را بررسی می کند، که می تواند حین مهاجرت نیز به ترتیب زیر انجام شوند:
· طول Url سند (Document Url lenght)
· سایز سند
· نام سند
· نوع فایل های پشتیبانی نشده
بررسی این موضوعات ضروری است تا بتوانید برای این خرابی ها با کاربر نهایی صحبت کنیم. کنسول Metalogix eRoom برای هر یک از این موضوعات گزارشی را بر اساس سورس eRoom و سایت SharePoint مورد نظر در جایی که content مهاجرت می کنند، تولید می کنند. این گزارشات به صورت فایل .csv تولید شده اند. در هر یک از بررسی ویژگی های پیش مهاجرت (eRoom pre-migration check feature) 4 فایل تولید می شود. ما در اینجا 230 eRoom را به محیط SharePoint 2010 مهاجرت می دهیم. بنابراین باید برای تمام 230 eRooms بررسی پیش مهاجرت بررسی شود و گزارش جداگانه ای تولید شود و نهایتاً بتوانیم با کاربر (business user) آن را مرور کنیم.
ترکیب این 230 فایل برای هر موضوع ممکن است چند روز طول بکشد و لازم باشد خیلی روی آن کار کنیم. به همین دلیل بهتر است از Windows PowerShell استفاده کنیم . چرا که با وجود تعداد زیادی cmdlets (command lets) ، می توانید از انجام کارهای اضافی خودداری کنید.
در ادامه یک تابع PowerShell را ایجاد می کنیم:
3 پارامتر ورودی
· $Path – مسیر پوشه ای که فایل های .csv ذخیره شده اند.
· $MergedFileName – نام فایلی که از ترکیب چند فایل .csv ایجاد می شود.
· $Filter – هر شرط فیلتر کننده ای که برای فیلتر کردن لیست فایل های .csv مورد نظر جهت ادغام
بر اساس مسیر و شرط فیلتر کننده، لیستی از فایل های ادغام شده را بدست می آورد.
if($Filter -ne $null -and $Filter -ne "")
{
$AllFilesToMerge = Get-ChildItem -Path $Path -File -Filter $Filter -Recurse
}
else
{
$AllFilesToMerge = Get-ChildItem -Path $Path -Recurse
}
سپس با import کردن هر فایل آن را پردازش می کنیم.
$csvFilePath = $FileToMerge.FullName
$csvContent = Import-Csv -Path "$csvFilePath"
سپس براساس هدر فایل .csv، محتویات آن را می خواند. هر سطر در فایل .csv در یک متغییر موقت PSObject ذخیره می شود تا بعداً به یک PSObject سراسری اضافه می شود.
نکته: باید اسکریپت هدر های csv تان را به روزرسانی کنید.
if ($csvContent - ne $null) {
foreach($entry in $csvContent) {#
You can also get the headers of particular.csv file like below - commented# $CSVContentObj = $csvContent | Get - Member - MemberType NoteProperty | Select - Object - ExpandProperty Name# Creating custom PS Object to hold the content temporarily
$CSVContentObj = 1 | select RoomName, SourceName, SourceURL, RectifiedName
$CSVContentObj.RoomName = $roomName# TODO: User need to update the headers manually before using this
function# $entry.
"
$CSVContentObj.SourceName = $entry.
"Source Name"
$CSVContentObj.SourceURL = $entry.
"Source URL"
$CSVContentObj.RectifiedName = $entry.
"Rectified Name"#
Adding custom PS object in the arrary
$CSVContentList += $CSVContentObj
}
}
else {
Write - Host - ForegroundColor Yellow "File don't have any content"
}
در آخر، اگر PSObject سراری، که حاوی تمام محتویات است، null نبود، محتویات را در فایل csv مورد نظر export می کنیم.
if ($CSVContentList - ne $null) {#
Getting current script execution location
$CurrentLoc = Get - Location
if ($MergedFileName.IndexOf(".csv") > 0) {
$csvPath = "$CurrentLoc\$MergedFileName"
}
else {
$csvPath = "$CurrentLoc\$MergedFileName.csv"
}#
Exporting the content as csv file
$CSVContentList | Export - Csv - Path $csvPath
Write - Host - ForegroundColor Green "Files merged successfully and exported at "
$csvPath
}