एक csv फ़ाइल स्थानांतरित करने के लिए एक कमांड लाइन उपयोगिता है?


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, और सी) यह भी दर्शाता है कि इनपुट / आउटपुट कैसे पारित किया जाए फ़ाइलें। ब्रावो @ ल्लिकोर, और यूनिक्स और लिनक्स में आपका स्वागत है। कृप्या इधर-उधर रहना।
कोरी क्लेन

सीएसवी में एक कैविएट, खेतों को उद्धृत किया जाना चाहिए
yosefrow

@yosefrow को उद्धृत करने की आवश्यकता नहीं है। मैंने यह उत्तर पोस्ट करने से पहले कमांड का परीक्षण किया।
लुआकोर

ठीक है, तो "हो सकता है" कहा जाना चाहिए। यह मेरे लिए तब तक काम नहीं आया जब तक मैंने सभी क्षेत्रों को उद्धृत नहीं किया। मेरी डेटा सामग्री के साथ करना पड़ सकता है
yosefrow

16

CSV पार्सिंग केवल POSIX टूल के साथ आसानी से नहीं किया जाता है, जब तक कि आप सरलीकृत CSV वेरिएंट का उपयोग बिना किसी उद्धरण के करते हैं (ताकि अल्पविराम किसी फ़ील्ड में प्रकट न हो सके)। तब भी यह कार्य टूल के लिए awk या अन्य टेक्स्ट प्रोसेसिंग के साथ करना आसान नहीं लगता है। आप पर्ल के साथ 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])


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++))
}

/ tmp / l क्या दर्शाता है? इसके अतिरिक्त, यह लाइनों के बजाय स्तंभों के माध्यम से लूप करने के लिए सरल नहीं होगा, कुछ की तर्ज पर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, 2300 लाइनों में csv.rb- अजगर में केवल 450 लाइनें हैं csv.py)।

यहाँ awk के लिए एक उदाहरण है:

#!/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];
    }
}

वैसे: दिए गए उदाहरण में अतिरिक्त स्थान था जिसे ओपी ने हटा दिया था; अन्य उदाहरणों ने इस विवरण को संबोधित नहीं किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.