2012-11-27 13 views
8

से एक CSV फ़ाइल को लिखें मेरे पास एक प्रोग्राम है जो फिलहाल FILE 1 से नीचे जैसा दिखता है और कुछ वर्णों से मेल खाता है। उदाहरण के लिए:हैश पर्ल

सब मैं एक 'प्रकार', 'फल', 'विवरण', 'मात्रा' के लिए हैश के हैश बना सकते हैं और संदर्भ हैश में विभिन्न मान संग्रहीत करना चाहता था की
Type, Fruit, Description, quantity 
tropical, banana, tasty and yummy, 5 
tropical, grapefruit, bitter and not yummy, 2 
... and so on 

पहले। यह नीचे दिए गए कोड के साथ ठीक काम करता है।

use strict; 
use warnings; 
use Data::Dumper; 
use Text::CSV; 

my %MacroA = ('Type' => {}, 'Fruit' => {}, 'Description' => {}, 'Quantity' => {});   

open (my $file, '<', 'FRUITIES.txt') or die $!;  

while (my $line = <$file>)                {           

if ($line =~ /\b(tropical)\b,/) {         
$MacroA{Type}->{$1}++; 
} 

if ($line =~ /,\b(banana|grapefruit)\b,/) {        
$MacroA{Fruit}->{$1}++; 
} 

if ($line =~ /,([\w\s]+?),/) {         
$MacroA{Description}->{$1}++; 
} 

if ($line =~ /,([\d]+?)/) {        
$MacroA{Quantity}->{$1}++; 
} 
     } 

close $file;      

तो मेरे सवाल का कैसे मैं इस डेटा (डेटा निश्चित नहीं है) एक csv फ़ाइल या संबंधित कुछ (शायद xls) में डाल सकते हैं, कि हैश के प्रत्येक हैश के लिए कॉलम युक्त तालिका होगा है (' टाइप करें ',' फल ',' विवरण ',' मात्रा ')।

+3

क्या आपने अपना कोड चलाने का प्रयास किया है? इसमें संकलन त्रुटियां हैं। आपको उन्हें ठीक करके शुरू करना चाहिए, फिर [टेक्स्ट :: सीएसवी] (http://p3rl.org/Text::CSV) पर एक नज़र डालें (जो आपको पहले से ही मिल गया है)। – simbabque

+0

hi @simbabque हाँ यह मूल कोड नहीं है, यह सिर्फ एक उदाहरण है। मैंने टेक्स्ट :: सीएसवी पर एक नज़र डाली थी लेकिन मुझे यकीन नहीं है कि इसका उपयोग कैसे किया जाए। –

+0

@El_Commandantee अगर यह केवल आपके उपयोग के लिए है या आप मॉड्यूल और अन्य चीजों के बिना 'गंदे' कोड लिख सकते हैं, तो आप उपयोग के साथ कोड लिख सकते हैं पर्ल कोर फ़ंक्शंस आसान – gaussblurinc

उत्तर

3

मैं मानता हूँ कि हैश के हैश एक अच्छी बात है, लेकिन मैं आपको लगता है ' इसे इस तरह से संग्रहीत न करें जिससे आप इसे आसानी से पुनर्प्राप्त कर सकें।

एक तरीका यह है कि आप ऐसा कर सकते हैं।

{ id_1 => { 
      data_1 => "blah", 
      data_2 => "foo", 
      ... 
      }, 
    id_2 => { 
      ... 
      }, 
    ... 
} 

सबसे पहले, आपको यह चुनने की आवश्यकता है कि कौन सा कॉलम "आईडी" होगा। यह प्रत्येक पंक्ति की विशिष्टता निर्धारित करेगा। मान लीजिए कि आपके उदाहरण के लिए फल चुनें, क्योंकि हम मानते हैं कि एक ही फाइल में कोई दो फल नहीं होंगे। तो हमारे पास ऐसा कुछ होगा:

{ banana => { 
      type => "tropical", 
      description => "tasty and yummy", 
      ... 
      }, 
    grapefruit => { 
      ... 
      }, 
    ... 
} 

इसे वापस CSV में बदलने के लिए, हम हैंश के माध्यम से लूप करते हैं।

my %fruit_data; #let's assume that this already has the data in it 

foreach my $fruit (keys %fruit_data) { 

    #given the $fruit you can now access all the data you need 
    my $type = %fruit_data{$fruit}{'type'}; 
    my $desc = %fruit_data{$fruit}{'description'}; 
    # etc... 

    # then you may want to store them in a scalar in any order you want 
    my $row = "$field,$type,$desc etc.\n"; 

    # then work your way from there 

} 
2

एक्सेल फ़ाइलों को लिखने के लिए - आप Spreadsheet::WriteExcel का उपयोग कर सकते हैं।

सीएसवी फाइलों के बारे में - मूल रूप से आपके पास "," डिलीमीटर और "\ n" स्ट्रिंग delimiters के साथ सीएसवी फ़ाइल है। आप कुछ सीएसवी को hashrefs की सरणी लिखने के लिए चाहते हैं - अपने आप से सरल उप लिख बेहतर तरीका, इस तरह ख़ाली:

use strict; 
use warnings; 

sub write_csv { 

    my ($array_ref, $fh) = @_; 

    for my $row (@$array_ref) { 
    print $fh join(',', map { $_, $row->{$_} } sort keys %$row), "\n"; 
    } 
} 

my $test = [ 
    {a => 1, ab => 2, type => '234k', count => '123'}, 
    {a => 3, ab => 2, type => 'some_type', count => 34}, 
]; 

open my $fh, '>', 'test.csv' or die $!; 

write_csv($test, $fh); 
+2

जो मोटे तौर पर, किसी भी सेल पर विफल रहता है जिसमें एक डिलीमीटर होता है। – ugexe

+2

मुझे लगता है कि उपरोक्त उन लोगों से आ रहे हैं जो इस कोड को अस्पष्ट करते हुए प्रभावित हैं। यह निश्चित रूप से – Borodin

+0

प्रश्न का उत्तर नहीं देता है अच्छा पीआर, मैन के लिए धन्यवाद। यह कम से कम प्रश्न का हिस्सा जवाब देता है - पर्ल के साथ एक्सेल फाइलें कैसे लिखें, और सीएसवी फाइलों को कैसे लिखें - इसलिए यदि आप कोड को ट्विक कर सकते हैं तो यह सही उत्तर के लिए सामान्य दिशा देता है। आवश्यकताओं के अनुसार कस्टम सीएसवी-फाइल लिखना सिर्फ एक प्रश्न की तुलना में एक फ्रीलांस नौकरी की तरह दिखता है। – moonsly

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