2010-01-13 14 views
6

के साथ सीएसवी हेडर प्रिंट करें मैंने एक सीएसवी फ़ाइल में डेटा का एक गुच्छा संसाधित करने के लिए टाई :: हैंडल :: सीएसवी का उपयोग करके एक पर्ल स्क्रिप्ट लिखी है और केवल एक नई सीएसवी फ़ाइल में मुझे जो चाहिए उसे प्रिंट करें। अभी, मैं तो बस द्वारा फ़ील्ड नाम के सभी के साथ शीर्ष लेख पंक्ति प्रिंट आउट एक यह हार्डकोड में तो जैसे:टाई :: हैंडल :: सीएसवी

print '"TERM", "STUDENT ID", "NAME", ..."'."\n"; 

मुझे लगता है यह ऐसा करने का एक गूंगा तरीका है, लेकिन मैं कैसे करने के लिए पता नहीं है टाई :: हैंडल :: सीएसवी ऑब्जेक्ट के भीतर से हेडर तक पहुंच प्राप्त करें। यह है, तो जैसे instantiated है

my $fh = Tie::Handle::CSV->new($file,header=> 1); 

और डेटा तो जैसे एक्सेस किया जाता है,

$line -> {'CATALOG_NBR'} 

मुझे पता है कि यह कैसे उपयोग करते हुए शीर्ष लेख मुद्रित करने के लिए पता करने के लिए यह एक हैश संदर्भ है पर्याप्त है, लेकिन पर्याप्त नहीं पता इसे हार्डकोडिंग के बजाए। जाहिर है, "वे" आमतौर पर प्रत्येक शब्द को फिर से काम करने के बाद स्क्रिप्ट प्राप्त करने के बाद सटीक कॉलम नाम बदलते हैं और ऑर्डर करते हैं।

किसी भी मदद के लिए बहुत बहुत धन्यवाद! जेए

उत्तर

3

यदि शीर्षलेख परिभाषित किया गया है और सरणी संदर्भ नहीं है, तो दस्तावेज़ की पहली पंक्ति हेडर के रूप में उपयोग की जाएगी। अफसोस की बात है कि मूल रूप से ऐसे शीर्षलेख को प्राप्त करने के लिए कोई तरीका नहीं है, इसलिए हेडर विकल्प का उपयोग करके पहली पंक्ति को गलत के रूप में पढ़ने से कम, इसे संग्रहीत करना (यह पहले से ही एक सरणी रेफरी है) और फ़ाइल को बंद करना और फिर से पढ़ना, मैं नहीं करता इसे करने का एक आसान तरीका देखें।

use strict; 
use warnings; 
use Tie::Handle::CSV; 
use Data::Dumper; 

my $csv_fh = Tie::Handle::CSV->new('basic.csv', header => 0); 
my $header = <$csv_fh>; 
close $csv_fh; 
print join(',', @$header), "\n"; 

$csv_fh = Tie::Handle::CSV->new('basic.csv', header => 1); 
while (my $csv_line = <$csv_fh>) { 
    # $csv_line can be used here 
    ... 
} 
close $csv_fh; 
+0

धन्यवाद दोस्तों - मैं अनिवार्य रूप से आपकी सलाह का संयोजन कर रहा हूं। मैंने दो फाइल हैंडल खोले - दूसरा $ $ hfh हेडर => 0 के साथ, इसलिए मैं हेडर लेबल्स को सही क्रम में प्रिंट कर सकता था: मेरा $ fh = टाई :: हैंडल :: सीएसवी-> नया ($ फ़ाइल , हेडर => 1); मेरा $ एचएफएच = टाई :: हैंडल :: सीएसवी-> नया ($ फ़ाइल, हेडर => 0); मेरी $ line = <$hfh>; मेरा $ हेडर; foreach (@ {$ line}) { $ हेडर। = "\" $ _ \ ","; } प्रिंट "$ शीर्षलेख \ n"; आपकी सहायता के लिए फिर से धन्यवाद! – Jason

2

the documentation के अनुसार, ऐसा लगता है कि आपके निर्माता में header => 1 को बंद करने से यह हेडर को पार्स नहीं कर पाएगा। आपको ऑब्जेक्ट से लौटाए गए पहले $line के रूप में हेडर कॉलम नाम प्राप्त करना चाहिए।

इसका यह भी मतलब है कि आपके $line रों हैश संदर्भ सरणी संदर्भ के बजाय, तो आप $line->[0], $line->[1] साथ स्थितीय मूल्यों प्रिंट आउट करने की आवश्यकता होगी, बजाय हेडर नाम का उपयोग करने के लिए किया जाएगा, और इतने पर।

यदि आप header => 1 विकल्प का उपयोग करना चाहते हैं, तो आप my @headers = keys %{ $line } के साथ हैश कुंजी प्राप्त कर सकते हैं। ध्यान दें कि कोई गारंटी नहीं है कि चाबियाँ किसी भी विशेष क्रम में होंगी, इसलिए आपको उन्हें स्वयं ऑर्डर करने का एक तरीका पता लगाना होगा।

मैंने वास्तव में इस मॉड्यूल का उपयोग नहीं किया है, इसलिए header विकल्प के लिए प्रलेखन पढ़ने पर आधारित यह अनुमान है।

+0

धन्यवाद लोग: उपयोग की तरह लग रहे हो सकता है। मैंने दो फाइल हैंडल खोले - दूसरा $ $ hfh हेडर => 0 के साथ है, इसलिए मैं हेडर लेबल्स को सही क्रम में प्रिंट कर सकता हूं: मेरा $ fh = टाई :: हैंडल :: सीएसवी-> नया ($ फ़ाइल, हेडर => 1); मेरा $ एचएफएच = टाई :: हैंडल :: सीएसवी-> नया ($ फ़ाइल, हेडर => 0); मेरी $ line = <$hfh>; मेरा $ हेडर; foreach (@ {$ line}) {$ हेडर। = "\" $ _ \ ","; } "$ हेडर \ n" प्रिंट करें; सहायता के लिए आपका दुबारा धन्यवाद! – Jason

1

धन्यवाद दोस्तों - मैं अनिवार्य रूप से आपकी सलाह का संयोजन कर रहा हूं। फिर आपकी सहायता के लिए

my $fh = Tie::Handle::CSV->new($file, header => 1); 
my $hfh = Tie::Handle::CSV->new($file, header=>0); 
my $line = <$hfh>; 
my $header; 
foreach(@{$line}) { 
    $header .= "\"$_\","; 
} 
print "$header\n"; 

धन्यवाद: हेडर के साथ साथ एक दूसरे $ hfh => 0 तो मैं हैडर लेबल सही क्रम में तो जैसे प्रिंट सकता है - मैं दो फ़ाइल हैंडल खोला!

6

पार्टी के लिए थोड़ा देर हो चुकी है, लेकिन मैंने अभी Tie::Handle::CSV का एक नया संस्करण जारी किया है (कुछ घंटों में सीपीएएन पर होना चाहिए)। यह header() विधि के लिए समर्थन जोड़ता है, जो एक CSV प्रारूपित शीर्षलेख देता है।- मैं अनिवार्य रूप से आपकी सलाह का एक संयोजन कर समाप्त हो गया

my $fh = Tie::Handle::CSV->new($file, header => 1); 
    print $fh->header; 

आशा इस मदद करता है,

  • danboo
+1

यह शानदार है! बहुत बहुत धन्यवाद - यह एक आकर्षण की तरह काम करता है। मैं इस बहुत सराहना करता हूं - जेसन – Jason