বাশে কোনও সিএসভি ফাইল কীভাবে পার্স করবেন?


111

আমি দীর্ঘ বাশ স্ক্রিপ্টে কাজ করছি। আমি একটি CSV ফাইল থেকে বাশ ভেরিয়েবলগুলিতে ঘরগুলি পড়তে চাই। আমি লাইনগুলি এবং প্রথম কলামটি পার্স করতে পারি তবে অন্য কোনও কলামটি নয়। এখন পর্যন্ত আমার কোডটি এখানে:


  cat myfile.csv|while read line
  do
    read -d, col1 col2 < <(echo $line)
    echo "I got:$col1|$col2"
  done

এটি কেবল প্রথম কলামটি মুদ্রণ করছে। অতিরিক্ত পরীক্ষা হিসাবে, আমি নিম্নলিখিতটি চেষ্টা করেছি:

read -d, x y < <(echo a,b,)

এবং $ y খালি। সুতরাং আমি চেষ্টা করেছি:

read x y < <(echo a b)

এবং $ y হয় b। কেন?


7
আপনি কি বিবেচনা করেছেন awkব্যবহার করতে $1, $2, ইত্যাদি?
বিমেরগুই

4
সিডেনোট হিসাবে: কমান্ড <<(প্রতিধ্বনি "স্ট্রিং") ---> কমান্ড <<< "স্ট্রিং"
টোকল্যান্ড

1
'কাট' কমান্ড লাইন প্রোগ্রামটি এর জন্য নকশা করা হয়েছিল: ss64.com/bash/cut.html
জয়

উত্তর:


214

এর IFSপরিবর্তে আপনার প্রয়োজন -d:

while IFS=, read -r col1 col2
do
    echo "I got:$col1|$col2"
done < myfile.csv

নোট করুন যে সাধারণ উদ্দেশ্যে সিএসভি পার্সিংয়ের জন্য আপনাকে এমন একটি বিশেষ সরঞ্জাম ব্যবহার করা উচিত যা বাশ নিজেই পরিচালনা করতে পারে না এমন অন্যান্য সমস্যাগুলির মধ্যে অভ্যন্তরীণ কমা দিয়ে উদ্ধৃত ক্ষেত্রগুলি পরিচালনা করতে পারে। এই জাতীয় সরঞ্জামগুলির উদাহরণ cvstoolএবং csvkit


7
প্রস্তাবিত সমাধানটি খুব সাধারণ সিএসভি ফাইলের জন্য সূক্ষ্ম, অর্থাত যদি শিরোনাম এবং মানগুলি কমা এবং এমবেডড কোটেশন চিহ্ন থেকে মুক্ত থাকে। জেনেরিক সিএসভি পার্সার লেখার বিষয়টি আসলে বেশ জটিল (বিশেষত যেহেতু বেশ কয়েকটি সিএসভি "স্ট্যান্ডার্ড" রয়েছে)। সিএসভি ফাইলগুলিকে * নিক্স সরঞ্জামগুলিতে আরও সাধ্যযুক্ত করার জন্য একটি পদ্ধতি হ'ল এগুলিকে টিএসভিতে রূপান্তর করা (ট্যাব-বিভাজিত মান), যেমন এক্সেল ব্যবহার করে।
শিখর

এটা আকর্ষণীয় যে আমি শরীরে mkdir করতে পারি না। আমি পেয়ে করছি command not found। শুধু echoকাজ।
Zsolt

1
@ জসোল্ট: এমনটি হওয়ার কোনও কারণ নেই। আপনার অবশ্যই একটি টাইপো বা স্ট্রে অ প্রিন্টিং অক্ষর থাকতে হবে।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

2
@ ডেনিসউইলিয়ামসন আপনার ব্যবহারকারীর যেমন বিভাজনগুলি বদ্ধ করা উচিত ;:while IFS=";" read col1 col2; do ...
থোমাস.এমসি.ওয়ার্ক

1
@ থোমাস.এমসি.ওয়ার্ক: সেমিকোলন এবং শেলের জন্য বিশেষত অন্যান্য চরিত্রের ক্ষেত্রে এটি সত্য। কমা ক্ষেত্রে, এটি প্রয়োজনীয় নয় এবং আমি অপ্রয়োজনীয় চরিত্রগুলি বাদ দিতে পছন্দ করি। উদাহরণস্বরূপ, আপনি সর্বদা কোঁকড়া ধনুর্বন্ধনী (উদাহরণস্বরূপ ${var}) ব্যবহার করে প্রসারণের জন্য ভেরিয়েবলগুলি নির্দিষ্ট করতে পারতেন , তবে যখন সেগুলি প্রয়োজন হয় না তখন আমি এগুলি বাদ দিই। আমার কাছে এটি দেখতে আরও পরিষ্কার দেখাচ্ছে।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

10

manপৃষ্ঠা থেকে :

-d ডিলিম ডেলিমের প্রথম চরিত্রটি নিউলাইন না করে ইনপুট লাইনটি শেষ করতে ব্যবহৃত হয়।

আপনি ব্যবহার করছেন -d,যা কমাতে ইনপুট লাইনটি শেষ করবে। এটি লাইনের বাকী অংশটি পড়বে না। এজন্যই $ y খালি।


3

আমরা সিএসভি ফাইলগুলি উদ্ধৃত স্ট্রিংগুলির সাথে পার্স করতে পারি এবং বলি | নিম্নলিখিত কোড সহ

while read -r line
do
    field1=$(echo $line | awk -F'|' '{printf "%s", $1}' | tr -d '"')
    field2=$(echo $line | awk -F'|' '{printf "%s", $2}' | tr -d '"')

    echo $field1 $field2
done < $csvFile

awk স্ট্রিং ফিল্ডগুলিকে ভেরিয়েবলগুলিতে পার্স করে এবং tr উদ্ধৃতি সরিয়ে দেয়।

প্রতিটি ক্ষেত্রের জন্য অ্যাজকে কার্যকর করা হিসাবে সামান্য ধীর।


1
ভাল, আপনি
কোমাও

0

আপনি যদি কিছু লাইন দিয়ে সিএসভি ফাইলটি পড়তে চান, তবে এটি সমাধান।

while IFS=, read -ra line
do 
    test $i -eq 1 && ((i=i+1)) && continue
    for col_val in ${line[@]}
    do
        echo -n "$col_val|"                 
    done
    echo        
done < "$csvFile"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.