2010-11-26 15 views
63

मैं एक लंबी बैश लिपि पर काम कर रहा हूं। मैं एक सीएसवी फ़ाइल से कोशिकाओं को बैश वैरिएबल में पढ़ना चाहता हूं। मैं लाइनों और पहले कॉलम को पार्स कर सकता हूं, लेकिन कोई अन्य कॉलम नहीं।बैश में एक 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 है। क्यूं कर?

+6

क्या आपने '$ 1',' $ 2', आदि का उपयोग करने के लिए 'awk' माना है? – BeemerGuy

+3

एक sidenote के रूप में: कमांड <<(echo "string") ---> कमांड <<< "स्ट्रिंग" – tokland

+0

'कट' कमांड लाइन प्रोग्राम उस के लिए डिज़ाइन किया गया था: http://ss64.com/bash/cut। एचटीएमएल – Jay

उत्तर

125

आप -d के बजाय IFS उपयोग करने की आवश्यकता:

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

नोट सामान्य प्रयोजन सीएसवी के लिए पार्स करने है कि आप एक विशेष उपकरण है जो अन्य मुद्दों के बीच आंतरिक अल्पविरामों से उद्धृत क्षेत्रों, संभाल कर सकते हैं का उपयोग करना चाहिए कि बैश नहीं कर सकते खुद से संभाल लें। ऐसे टूल्स के उदाहरण cvstool और csvkit हैं।

+1

मुझे लगता है कि 'iFS = होना चाहिए, col1 col2' – rudivonstaden

+0

@rudivonstaden पढ़ें: धन्यवाद, मैंने इसे ठीक किया है। –

+2

प्रस्तावित समाधान बहुत सरल सीएसवी फाइलों के लिए ठीक है, यानी, यदि हेडर और मान अल्पविराम और एम्बेडेड उद्धरण चिह्नों से मुक्त हैं। एक सामान्य सीएसवी पार्सर लिखना वास्तव में काफी मुश्किल है (विशेष रूप से क्योंकि कई सीएसवी "मानकों" हैं)। सीएसवी फाइलों को * निक्स टूल्स के लिए अधिक सक्षम बनाने के लिए एक दृष्टिकोण उन्हें टीएसवी (टैब से अलग मूल्यों) में परिवर्तित करना है, उदा। एक्सेल का उपयोग करना – peak

6

man पृष्ठ से:

-d परिसीमक परिसीमक का पहला वर्ण इनपुट लाइन समाप्त करने के लिए प्रयोग किया जाता है, बल्कि न्यू लाइन से।

आप -d, का उपयोग कर रहे हैं जो अल्पविराम पर इनपुट लाइन को समाप्त कर देगा। यह बाकी रेखा को नहीं पढ़ेगा। यही कारण है कि $ y खाली है।

संबंधित मुद्दे