সিএসভিতে মানগুলি এবং ফর্ম্যাটটি এক্সট্রাক্ট করতে jq ব্যবহার করে


57

আমার নীচের জেএসওএন ফাইল রয়েছে:

{
"data": [
    {
        "displayName": "First Name",
        "rank": 1,
        "value": "VALUE"
    },
    {
        "displayName": "Last Name",
        "rank": 2,
        "value": "VALUE"
    },
    {
        "displayName": "Position",
        "rank": 3,
        "value": "VALUE"
    },
    {
        "displayName": "Company Name",
        "rank": 4,
        "value": "VALUE"
    },
    {
        "displayName": "Country",
        "rank": 5,
        "value": "VALUE"
    },
]
}

আমি এই ফর্ম্যাটটিতে একটি সিএসভি ফাইল রাখতে চাই:

First Name, Last Name, Position, Company Name, Country
VALUE, VALUE, VALUE, VALUE, VALUE, VALUE

এটি কি কেবল ব্যবহার করে সম্ভব jq? আমার কোনও প্রোগ্রামিং দক্ষতা নেই।


1
আমি নীচে একটি উত্তর সরবরাহ করেছি, তবে আমি এখন আপনার প্রশ্নটি ঘনিষ্ঠভাবে দেখছি এবং আমি ভাবতে পারি না - the ষ্ঠ ভ্যালু কোথা থেকে আসার কথা?
মাইক্রজারভ

1
এসও থেকে সম্পর্কিত: স্ট্যাকওভারফ্লো.
com/ প্রশ্নগুলি

এছাড়াও এর সাথে সম্পর্কিত stackoverflow.com/q/32960857/168034
phunehehe

উত্তর:


50

একটি অ্যারেটিকে CSV স্ট্রিংয়ে রূপান্তর করার জন্য jq এর একটি ফিল্টার, @csv রয়েছে। এই ফিল্টারটি CSV ফর্ম্যাটটির সাথে সম্পর্কিত ক্ষেত্রগুলিতে এম্বেড কমা দিয়ে শুরু করে বেশিরভাগ জটিলতার বিষয়টি বিবেচনা করে। (জ্যাকিউ ১.৫ এর ট্যাব-বিচ্ছিন্ন-মান ফাইলগুলি তৈরি করার জন্য @tsv- তে একই ফিল্টার রয়েছে has)

অবশ্যই, যদি শিরোনাম এবং মানগুলি সকলকে কমা এবং ডাবল উদ্ধৃতি চিহ্নমুক্ত করার গ্যারান্টিযুক্ত থাকে তবে @ সিএসভি ফিল্টার ব্যবহার করার দরকার নেই। অন্যথায় এটি সম্ভবত ব্যবহার করা ভাল।

উদাহরণস্বরূপ, যদি 'কোম্পানির নাম' যদি 'স্মিথ, স্মিথ এবং স্মিথ' হয় এবং অন্যান্য মানগুলি নীচে দেখানো হয় তবে "-r" বিকল্পের সাহায্যে জেউকে অনুরোধ করা বৈধ সিএসভি তৈরি করবে:

$ jq -r '.data | map(.displayName), map(.value) | @csv' so.json2csv.json
"First Name","Last Name","Position","Company Name","Country"
"John (""Johnnie"")","Doe","Director, Planning and Posterity","Smith, Smith and Smith","Transylvania"

3
আমি 'জেকি সামস্টাফ' করতে সক্ষম হয়েছি | মানচিত্র (।) | @ সিএসভি ', খুব সহজ! ধন্যবাদ
ফ্লিকফ্ল্যাফলি

3
আপনার উদাহরণ সমস্ত রেকর্ডের প্রতি রেখার পরিবর্তে এক লাইনের পরিবর্তে প্রথম লাইনে এবং সমস্ত মানকে দ্বিতীয় লাইনে রাখবে।
ব্রায়ান গর্ডন

33

আমি প্রতিটি রেকর্ডকে আমার সিএসভিতে সারি করতে পছন্দ করি।

jq '.data | map([.displayName, .rank, .value] | join(", ")) | join("\n")'

2
কি যদি। মান মান হয়? আমি ত্রুটিটি পেয়েছি "স্ট্রিং এবং নম্বর যোগ করা যায় না"
কোস

2
@ উপরোক্ত উদাহরণের .value|tostringপরিবর্তে কিছু পছন্দ করুন.value
গণিত

4
@ কোস, আমি খুঁজে পেয়েছি যে প্রথম বন্ধনী আবশ্যক। (.value|tostring)
সিস্কোগ্যাম্বো

এছাড়াও, jq -rউদ্ধৃতিগুলি
ক্লে

30

এই ফাইলটি দেওয়া, আপনি যেমন কিছু করতে পারেন:

<testfile jq -r '.data | map(.displayName), map(.value) | join(", ")'

.অপারেটর একটি বস্তু / হ্যাশ থেকে একটি ক্ষেত্র নির্বাচন করে। এইভাবে, আমরা শুরু করি .data, যা এতে থাকা ডেটার সাথে অ্যারে প্রদান করে। তারপরে আমরা অ্যারের উপরে দু'বার ম্যাপ করে প্রথমে ডিসপ্লেনামটি নির্বাচন করি, তারপরে মানটি নির্বাচন করি, সেই কীগুলির কেবলমাত্র মান সহ দুটি অ্যারে প্রদান করি। প্রতিটি অ্যারের জন্য, আমরা দুটি লাইন তৈরি করে "," এর সাথে উপাদানগুলিতে যোগদান করি। -rযুক্তি বলে jqফলে স্ট্রিং উদ্ধৃত না।

যদি আপনার আসল ফাইলটি দীর্ঘ হয় (যেমন, একাধিক ব্যক্তির জন্য এন্ট্রি রয়েছে), আপনার সম্ভবত কিছুটা জটিল জটিলতার প্রয়োজন হবে।


এটি আমার পক্ষে কাজ করছে না। একটি সম্পর্কিত বিষয়ে, উত্তর stackoverflow.com/questions/32960857/… উভয় কার্যকর এবং খুব ভাল ব্যাখ্যা করা হয়!
হারভে

10

আমি পেয়েছি jqআমার মাথার চারপাশে মোড়ানো কঠিন। এখানে কিছু রুবি:

ruby -rjson -rcsv -e '
  data = JSON.parse(File.read "file.json")
  data["data"].collect {|item| [item["displayName"], item["value"]]}
              .transpose
              .each {|row| puts row.to_csv}
'
First Name,Last Name,Position,Company Name,Country
VALUE,VALUE,VALUE,VALUE,VALUE

রুবি জেএসওন পার্সার বন্ধ বন্ধনীটির আগে ট্রিলিং কমা সম্পর্কে বার্ফড করে।


2

যেহেতু আপনি এটি ট্যাগ করেছেন pythonএবং ধরে নিচ্ছেন jsonফাইলের নামx.json

import os, json
with open('x.json') as f:
    x  = json.load(f)
    print '{}{}{}'.format(', '.join(y['displayName'] for y in x['data']), os.linesep,
             ', '.join(y['value'] for y in x['data']))
First Name, Last Name, Position, Company Name, Country
VALUE, VALUE, VALUE, VALUE, VALUE

1

যদিও এটি কাজ করতে আমাকে আপনার উদাহরণ ইনপুটটিতে সর্বশেষ কমাটি সরিয়ে ফেলতে jqহয়েছিল কারণ অন্য অ্যারে উপাদান আশা করার অভিযোগ ছিল, এটি:

INPUT | jq -r '[.[][].displayName], [.[][].value]| join(", ")'

... আমাকে পেয়েছে ...

First Name, Last Name, Position, Company Name, Country
VALUE, VALUE, VALUE, VALUE, VALUE

সংক্ষেপে এটি কীভাবে কাজ করে:

  1. আমি খালি []সূচি ক্ষেত্রের ফর্ম এবং .dotস্বরলিপি ব্যবহার করে ডেটা অবজেক্টের তৃতীয় স্তরের দিকে যেতে পেরেছি ।
  2. একবার যথেষ্ট গভীর আমি ডেটা ক্ষেত্রগুলি নাম দ্বারা পছন্দ করেছিলাম উল্লেখ করেছিলাম .[][].displayName
  3. আমি আশ্বাস দিয়েছি যে আমার কাঙ্ক্ষিত ক্ষেত্রগুলি আলাদা আলাদা অ্যারে অবজেক্ট হিসাবে তাদের ফিরিয়ে স্ব-সম্পৃক্ত [.[][].displayName], [.[][].value]
  4. এবং তারপরে objects অবজেক্টগুলিকে join(", ")পৃথক সত্তা হিসাবে যোগদানের জন্য ফাংশনটিতে পাইপ দেওয়া হয়েছে ।

সত্য সত্যই [.field]করাই অন্য উপায়, map(.field)তবে এটি কিছুটা সুনির্দিষ্ট যে এটি পছন্দসই ডেটা পুনরুদ্ধারের জন্য গভীরতার স্তর নির্দিষ্ট করে।

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