সিএসভি-ফাইল স্থানান্তর করার জন্য কি কোনও কমান্ড লাইন ইউটিলিটি রয়েছে?


16

এর মত একটি ফাইল দেওয়া হয়েছে

First,Last,Age
Cory,Klein,27
John Jacob,Smith,30

বিষয়বস্তু স্থানান্তর করার জন্য একটি কমান্ড লাইন ইউটিলিটি রয়েছে যাতে আউটপুটটি এর মতো প্রদর্শিত হয়

First,Cory,John Jacob
Last,Klein,Smith
Age,27,30

উত্তর:


6
ruby -rcsv -e 'puts CSV.parse(STDIN).transpose.map &:to_csv' < in.csv > out.csv

এই প্রশ্নের বয়স বিবেচনা করে আমি এইটিকে আমার গ্রহণযোগ্য হিসাবে পরিবর্তন করার ন্যায্যতা প্রমাণ করব: ক) এই উত্তরটি গিলসের চেয়ে অনেক বেশি সংক্ষিপ্তসার python, খ) এর rubyচেয়ে কম পোর্টেবল নয় python, এবং গ) এটি কীভাবে ইনপুট / আউটপুটটি পাস করবেন তাও দেখায় নথি পত্র. ব্রাভো @ লুইকোর, এবং ইউনিক্স এবং লিনাক্সে আপনাকে স্বাগতম। চারপাশে লাঠি না দয়া করে।
Cory Klein


@ ইউসফ্রো আমি এই উত্তরটি পোস্ট করার আগে কমান্ডটি পরীক্ষা করেছিলাম।
লুইকোর

ঠিক আছে "তখন" বলতে হবে। আমি সমস্ত ক্ষেত্রের উদ্ধৃতি না দেওয়া পর্যন্ত এটি আমার পক্ষে কাজ করে না। আমার ডেটা সামগ্রীতে
ইউসফ্রো

16

সিএসভি পার্সিং কেবলমাত্র পসইক্স সরঞ্জামগুলির সাহায্যে সহজেই করা যায় না, যদি না আপনি কোনও সরলিকৃত সিএসভি বৈকল্পিক ব্যবহার না করে কোনও উদ্ধৃতি না দিয়ে থাকেন (যাতে কমাগুলি কোনও ক্ষেত্রে প্রদর্শিত না হয়)। তারপরেও এই কাজটি টাস্ক বা অন্য পাঠ্য প্রক্রিয়াজাতকরণ থেকে টু টু টুল দিয়ে করা সহজ মনে হয় না। আপনি পার্ল উইথ Text::CSVপাইথন csv, আর উইথ read.csvরুবি, সিএসভি সহ রুবি , ... (এগুলি সব পার্ল ব্যতীত সংশ্লিষ্ট ভাষার স্ট্যান্ডার্ড লাইব্রেরির অংশ।)

উদাহরণস্বরূপ, পাইথনে:

import csv, sys
rows = list(csv.reader(sys.stdin))
writer = csv.writer(sys.stdout)
for col in xrange(0, len(rows[0])):
    writer.writerow([row[col] for row in rows])

11

Https://stackoverflow.com/a/2776078 থেকে :

$ apt-get install csvtool

এবং তারপরে রূপান্তর করুন

$ csvtool transpose input.csv > ouput.csv

বা পাইপলাইনে

$ ... | csvtool transpose - | ...

1
সুন্দর। কেবল ... | csvtranspose | ...এটিকে পরাস্ত করবে সিনট্যাক্স-ভিত্তিতে।
মাস্টারেক্সিলো

3

একটি দ্রুত এবং নোংরা সমাধান:

c=1
file=file.txt
num_lines=$(wc -l < "$file")

for ((i=0; i<num_lines; i++)) {
    cut -d, -f$c "$file" | paste -sd ','
    ((c++))
}

/ টিএমপি / এল কি উপস্থাপন করে? for ((i=1; i<=$num_cols; ++i)); do paste -s -d, <(cut -f$i -d, file.txt); done
তদ্ব্যতীত

নোট করুন যে এটি ওপির ইনপুটটির জন্য কাজ করে, তবে কেবলমাত্র তাদের ডেটাতে একই সংখ্যক সারি এবং কলাম রয়েছে, যা সাধারণত হয় না।
টোকল্যান্ড

সিএসভির ডিপুবল কোট সম্পর্কিত স্পেসিফিকেশন রয়েছে, this "is" exampleসেলটি এনকোড করা হয়েছে "this ""is"" example"যদি এই সমাধানটি এই ধরনের মামলাগুলি সঠিকভাবে পরিচালনা করে তবে আমি নিশ্চিত নই
গ্রজেগোর্জ ওয়েয়ারজোইকিকি

0

প্রস্তাবিত সীমাবদ্ধতা (কোন উদ্ধৃতি, কোনও এমবেডেড কমা) দেওয়া না থাকায় এটি সহজ সরল (যেমন এটি পার্ল হিসাবে এক হাজার লাইনের উপরে বিবেচনা না করে CSV.pm, ২৩০০ লাইন ইন csv.rb- পাইথনটিতে কেবল 450 লাইন থাকে csv.py)।

অ্যাডকের জন্য এখানে একটি উদাহরণ দেওয়া হয়েছে:

#!/usr/bin/awk -f
BEGIN { width=0; }
{
    max = split($0, list, ",");
    # printf "%d:%s\n", NR, $0;
    if (width < max)
        width = max;
    for (n = 1; n <= max; ++n) {
        sub("^[     ]*","",list[n]);
        sub("[  ]*$","",list[n]);
        # printf "\t%d:%s\n", n, list[n];
        if ( columns[n] != "" ) {
            columns[n] = columns[n] ", ";
        }
        columns[n] = columns[n] list[n];
    }
}
END {
    # printf "%d columns\n", width;
    for (n = 1; n <= width; ++n) {
        printf "%s\n", columns[n];
    }
}

যাইহোক, প্রদত্ত উদাহরণটিতে অতিরিক্ত স্থান ছিল যা ওপি ধরে নিয়েছে তা সরানো হবে; অন্যান্য উদাহরণগুলি এই বিশদটি সম্বোধন করে না।

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