পাওয়ারশেলের লাইনে ফাইল লাইন পড়ুন


111

আমি পাওয়ারশেলের লাইনে একটি ফাইল লাইন পড়তে চাই। বিশেষত, আমি ফাইলটি লুপ করতে চাই, প্রতিটি লাইন লুপের মধ্যে একটি ভেরিয়েবলে সঞ্চয় করতে এবং লাইনটিতে কিছু প্রক্রিয়াজাতকরণ করতে চাই।

আমি বাশ সমতুল্য জানি:

while read line do
    if [[ $line =~ $regex ]]; then
          # work here
    fi
done < file.txt

পাওয়ারশেল লুপগুলিতে খুব বেশি ডকুমেন্টেশন নেই।


ম্যাথিয়াস থেকে নির্বাচিত উত্তরটি কোনও দুর্দান্ত সমাধান নয়। Get-Contentপুরো ফাইলটিকে একবারে মেমরিতে লোড করে, যা ব্যর্থ হবে বা বড় ফাইলগুলিতে স্থির হবে।
কলব ক্যানিয়ন

4
@ KolobCanyon যা সম্পূর্ণ অসত্য। ডিফল্টরূপে গেট-কনটেন্ট পাইপলাইনে প্রতিটি লাইনকে একটি অবজেক্ট হিসাবে লোড করে। যদি আপনি এমন কোনও ফাংশনে পাইপ করছেন যা কোনও processব্লক নির্দিষ্ট করে না , এবং পাইপলাইনে প্রতি লাইন প্রতি অন্য কোনও বস্তু ছড়িয়ে দেয়, তবে সেই ফাংশনটিই সমস্যা। সম্পূর্ণ সামগ্রী মেমোরিতে লোড করার সাথে কোনও সমস্যা এর দোষ নয় Get-Content
ফিশ

@ ফিশ foreach($line in Get-Content .\file.txt)এটি পুনরাবৃত্তি শুরু হওয়ার আগে পুরো ফাইলটিকে মেমরিতে লোড করবে। আপনি যদি আমাকে বিশ্বাস না করেন তবে 1 জিবি লগ ফাইলটি দেখুন এবং এটি ব্যবহার করে দেখুন।
কলব ক্যানিয়ন

4
পছন্দ করেছেন আপনি বলেছিলেন যে গেট-কনটেন্ট এটিকে সমস্ত স্মৃতিতে লোড করে দেয় যা সত্য নয়। আপনার পূর্বাভাসের পরিবর্তিত উদাহরণ হ্যাঁ; foreach পাইপলাইন সচেতন নয়। Get-Content .\file.txt | ForEach-Object -Process {}পাইপলাইন সচেতন, এবং পুরো ফাইলটি মেমরিতে লোড করবে না। ডিফল্টরূপে পান-সামগ্রী পাইপলাইনের মাধ্যমে একবারে একটি লাইন অতিক্রম করবে।
ফিশ

উত্তর:


190

পাওয়ারশেল লুপগুলিতে খুব বেশি ডকুমেন্টেশন নেই।

PowerShell মধ্যে লুপ উপর ডকুমেন্টেশন অঢেল, এবং আপনি নিম্নলিখিত সাহায্যের বিষয় চেক আউট করতে চান করতে পারেন: about_For, about_ForEach, about_Do, about_While

foreach($line in Get-Content .\file.txt) {
    if($line -match $regex){
        # Work here
    }
}

আপনার সমস্যার আর একটি ইডিয়োমেটিক পাওয়ারশেল সমাধান হ'ল পাঠ্য ফাইলের লাইনগুলি ForEach-Objectসেমিডলেটে পাইপ করা :

Get-Content .\file.txt | ForEach-Object {
    if($_ -match $regex){
        # Work here
    }
}

লুপের অভ্যন্তরে রেজেক্সের মিলের পরিবর্তে, আপনি Where-Objectআগ্রহী কেবল ফিল্টার করার জন্য আপনি লাইনগুলি পাইপ করতে পারেন :

Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
    # Work here
}

56

Get-Contentখারাপ কর্মক্ষমতা আছে; এটি একবারে মেমরিতে ফাইলটি পড়ার চেষ্টা করে।

সি # (.নেট) ফাইল রিডার প্রতিটি লাইন একে একে পাঠ করে

সেরা অভিনয়

foreach($line in [System.IO.File]::ReadLines("C:\path\to\file.txt"))
{
       $line
}

বা কিছুটা কম অভিনয়

[System.IO.File]::ReadLines("C:\path\to\file.txt") | ForEach-Object {
       $_
}

foreachবিবৃতি সম্ভবত সামান্য দ্রুততর হবে চেয়ে ForEach-Object(আরও তথ্যের জন্য নীচের মন্তব্য দেখুন)।


4
আমি সম্ভবত ব্যবহার করতে হবে [System.IO.File]::ReadLines("C:\path\to\file.txt") | ForEach-Object { ... }foreachবিবৃতি হবে একটা অবজেক্ট সম্পূর্ণ সংগ্রহ লোডForEach-Objectস্ট্রিম করতে পাইপলাইন ব্যবহার করে। এখন foreachবিবৃতিটি সম্ভবত ForEach-Objectকমান্ডের চেয়ে কিছুটা দ্রুত হবে তবে এটি পুরো কারণটিকে মেমোরিতে লোড করা সাধারণত দ্রুত হয়। Get-Contentএখনও ভয়ঙ্কর।
বেকন বিট 0

@ বাকনবিটস foreach()এর একটি উপনামForeach-Object
ক্যানিয়ন

17
এটি একটি খুব সাধারণ ভুল ধারণা। foreachএকটি বিবৃতি, মত if, forঅথবা whileForEach-Objectএকটি আদেশ, মত Get-ChildItem। এর foreachজন্য একটি ডিফল্ট নামও ForEach-Objectরয়েছে তবে পাইপলাইন থাকলেই এটি ব্যবহৃত হয়। এর দীর্ঘ ব্যাখ্যাটি দেখুন Get-Help about_Foreach, বা আমার আগের মন্তব্যে লিঙ্কটি ক্লিক করুন যা বিবৃতি এবং কমান্ডের মধ্যে পার্থক্য সম্পর্কে মাইক্রোসফ্টের স্ক্রিপ্টিং গাইসের একটি সম্পূর্ণ নিবন্ধে যায়।
বেকন বিটস

4
@ বাকনবিটস ব্লগস.টেকনেট.মাইক্রোসফট. / হিজিপ্টিংগুই / ২০১৪ / 07 / ২০১৮ নতুন কিছু শিখেছে। ধন্যবাদ আমি ধরে নিয়েছিলাম যে সেগুলি একই কারণ Get-Alias foreach=> Foreach-Object, তবে আপনি ঠিক বলেছেন, পার্থক্য রয়েছে
কলব ক্যানিয়ন

4
এটি কাজ করবে তবে আপনি লুপের স্ক্রিপ্ট ব্লকে পরিবর্তন $lineকরতে চান $_
বেকন বিট 18

3

সর্বশক্তিমান switchএখানে ভাল কাজ করে:

'one
two
three' > file

$regex = '^t'

switch -regex -file file { 
  $regex { "line is $_" } 
}

আউটপুট:

line is two
line is three
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.