2011-01-26 46 views
26

मैंने CSV फ़ाइल को कैसे लेना है और फिर हेडर के साथ एक सहयोगी सरणी बनाने के बारे में कई उदाहरण देखे हैं।सीएसवी से एसोसिएटिव ऐरे

उदाहरण के लिए:

Brand,Model,Part,Test 
Honda,Civic,123,244 
Honda,Civic,135,434 
Toyota,Supra,511,664 

यह एक सरणी कहाँ पैदा करेगा इस तरह के Array[$num][$key] जहां $key के रूप में ब्रांड, मॉडल, भाग, टेस्ट होगा।

तो अगर मैं परीक्षण मूल्य "434" मैं पाश करने के लिए सरणी में हर सूचकांक होता है और फिर किसी भी ब्रांड है कि होंडा नहीं थे, और किसी भी मॉडल है कि सिविक नहीं थे उपेक्षा का उपयोग करना चाहता था


मुझे जो करना है वह प्रत्येक $ num इंडेक्स के माध्यम से जाने वाले लूप के माध्यम से चलने के बजाय सबसे अधिक मूल्य तक पहुंच सकता है।

foreach $model in Array['Honda']

तरह

Array['Honda']['Civic']['135']

या हर मॉडल होंडा है के माध्यम से पाशन के साथ बयान के लिए एक को नियंत्रित ... कुछ: मैं मूल्य परीक्षण "434" के साथ उपयोग करने में सक्षम होना चाहता हूँ कम से कम मुझे एक ज्ञात ब्रांड दिए गए प्रत्येक मॉडल के माध्यम से जाने और प्रत्येक के लिए सभी सापेक्ष जानकारी तक पहुंचने में सक्षम होना चाहिए।

संपादित करें:

बस मैं इस ऊपर एक उदाहरण स्थापित किया गया था पुष्टि करने के लिए। मेरे वास्तव में डेटा की तरह हेडर हैं:

brand model part price shipping description footnote

जो की मैं सभी जानकारी हिस्सा (कीमत, शिपिंग, desc, फुटनोट) लाइन द्वारा csv फ़ाइल लाइन पर

+1

[उदाहरण (रों) के साथ कि कैसे करना है 'SplFileInfo'] के लिए (http://stackoverflow.com/a/10181302/367456) – hakre

उत्तर

48

रन से बंधा तक पहुंचने की आवश्यकता और जैसी सरणी के लिए सम्मिलित करें:

$array = $fields = array(); $i = 0; 
$handle = @fopen("file.csv", "r"); 
if ($handle) { 
    while (($row = fgetcsv($handle, 4096)) !== false) { 
     if (empty($fields)) { 
      $fields = $row; 
      continue; 
     } 
     foreach ($row as $k=>$value) { 
      $array[$i][$fields[$k]] = $value; 
     } 
     $i++; 
    } 
    if (!feof($handle)) { 
     echo "Error: unexpected fgets() fail\n"; 
    } 
    fclose($handle); 
} 
+0

वर्क्स उदाहरण के लिए ओपी ने दिया, लेकिन सावधान रहें कि सीएसवी फाइलों में टेक्स्ट फ़ील्ड में कॉमा हो सकता है: फ़ील्ड 1, "फील्ड दो", "फ़ील्ड, 3", फील्ड 4। – xelco52

+1

@ xelco52: 'fgetcsv()' ठीक से संभाल लेंगे। – BoltClock

+0

ठीक है मैं fgetcsv –

15

बनाने के लिए एक साहचर्य सूची सरणी की तरह कुछ का उपयोग करें:

$keys = fgetcsv($f); 
while (!feof($f)) { 
    $array[] = array_combine($keys, fgetcsv($f)); 
} 

function find($find) { 
    foreach ($array as $row) { 
     if (array_intersect_assoc($row, $find) == $find) { 
      $result[] = $row; 
     } 
    } 
} 

कहाँ आप इसे $find = array(Brand=>Honda, Model=>Civic, Part=>135) साथ आह्वान खोजा मॉडल को फिल्टर करने की होगी:

और पार और विशिष्ट विशेषताओं के द्वारा फिल्टर करने के लिए की तरह एक समारोह में लिखें। अन्य स्थितित्मक सरणी संरचना बहुत व्यावहारिक नहीं लगती है, जब तक कि आप केवल "टेस्ट" विशेषता तक पहुंच नहीं लेना चाहते हैं।

2

यहां एक समाधान है जो स्थानीय फ़ाइल या यूआरएल निर्दिष्ट करके काम करेगा। आप एसोसिएशन को चालू और बंद भी कर सकते हैं। उम्मीद है कि यह मदद करता है।

class CSVData{ 
    public $file; 
    public $data; 
    public $fp; 
    public $caption=true; 
    public function CSVData($file=''){ 
     if ($file!='') getData($file); 
    } 
    function getData($file){ 
     if (strpos($file, 'tp://')!==false){ 
      copy ($file, '/tmp/csvdata.csv'); 
      if ($this->fp=fopen('/tmp/csvdata.csv', 'r')!==FALSE){ 
       $this->readCSV(); 
       unlink('tmp/csvdata.csv'); 
      } 
     } else { 
      $this->fp=fopen($file, 'r'); 
      $this->readCSV(); 
     } 
     fclose($this->fp); 
    } 
    private function readCSV(){ 
     if ($this->caption==true){ 
      if (($captions=fgetcsv($this->fp, 1000, ","))==false) return false; 
     } 
     $row=0; 
     while (($data = fgetcsv($this->fp, 1000, ",")) !== FALSE) { 
      for ($c=0; $c < count($data); $c++) { 
       $this->data[$row][$c]=$data[$c]; 
       if ($this->caption==true){ 
        $this->data[$row][$captions[$c]]=$data[$c]; 
       } 
      } 
      $row++; 
     } 
    } 
} 

इस प्रयोग का प्रयास करें:

$o=new CSVData(); 
$o->getData('/home/site/datafile.csv'); 
$data=$o->data; 
print_r($data); 
+0

ब्लॉग लिंक मृत है –

4

इस सरल एल्गोरिथ्म का प्रयास करें:

 $assocData = array(); 

     if(($handle = fopen($importedCSVFile, "r")) !== FALSE) { 
      $rowCounter = 0; 
      while (($rowData = fgetcsv($handle, 0, ",")) !== FALSE) { 
       if(0 === $rowCounter) { 
        $headerRecord = $rowData; 
       } else { 
        foreach($rowData as $key => $value) { 
         $assocData[ $rowCounter - 1][ $headerRecord[ $key] ] = $value; 
        } 
       } 
       $rowCounter++; 
      } 
      fclose($handle); 
     } 

     var_dump($assocData); 
23

बहुत सारे लंबे समाधान।मैं हमेशा पाया है यह सबसे सरल होने के लिए:

<?php 
    /* Map Rows and Loop Through Them */ 
    $rows = array_map('str_getcsv', file('file.csv')); 
    $header = array_shift($rows); 
    $csv = array(); 
    foreach($rows as $row) { 
     $csv[] = array_combine($header, $row); 
    } 
?> 
+0

सरल और गतिशील - महान समाधान। धन्यवाद! – domdambrogia

+0

धन्यवाद बडी, महान समाधान। – GuRu

+0

यह बहुत अच्छा काम करता है, मैंने कभी भी सरणी गठबंधन का उपयोग नहीं किया, लेकिन यह कमाल काम किया! धन्यवाद! –

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