2012-04-16 20 views
15

के लिए कॉलम शीर्षलेख के साथ ऐरे में प्रक्रिया सीएसवी मेरे पास फ़ील्ड नाम वाली पहली पंक्ति वाला सीएसवी है। उदाहरण डेटा ...कुंजी

"Make","Model","Note" 
"Chevy","1500","loaded" 
"Chevy","2500","" 
"Chevy","","loaded" 

मैं अपने डेटा कुंजी-मान जोड़ों की एक सरणी जहां कुंजी नाम स्तंभ शीर्ष है में स्वरूपित की जरूरत है। मुझे लगता है कि यह पंक्ति 1 के लिए कुछ इस तरह होगा:

$array = [ 
    "Make" => "Chevy", 
    "Model" => "1500", 
    "Note" => "loaded" 
]; 

... पंक्ति 2 ...

$array = [ 
    "Make" => "Chevy", 
    "Model" => "1500", 
    "Note" => "" 
]; 

... और पंक्ति 3 ...

$array = [ 
    "Make" => "Chevy", 
    "Model" => "", 
    "Note" => "loaded" 
]; 

मैं 'यह सुनिश्चित नहीं है कि यह स्थिर रूप से अन्य कैसे करें - समस्या यह है कि उनके संबंधित डेटा के साथ कॉलम एक फ़ाइल से अगले में बदल सकते हैं ... कॉलम पुन: व्यवस्थित, गिराए गए या जोड़े गए।

आपके विचारों की बहुत सराहना की जाती है।

+0

आप शायद मतलब 2500 दूसरी सरणी उदाहरण में – user1899415

उत्तर

39
$all_rows = array(); 
$header = fgetcsv($file); 
while ($row = fgetcsv($file)) { 
    $all_rows[] = array_combine($header, $row); 
} 
print_r($all_rows); 
+0

त्वरित प्रतिक्रिया के लिए धन्यवाद। यह करीब है हालांकि मैं चाबियों में डेटा के साथ समाप्त हो रहा हूँ। लौटाए गए किसी भी सरणी में कोई कॉलम शीर्षलेख न देखें। –

+1

@ बिटबकेट: यदि आप '$ all_rows' में मौजूद डेटा का डंप करते हैं, तो आपको सर-एरे के साथ एक सरणी दिखाई देनी चाहिए जिसमें हेडर डेटा कुंजी के रूप में हो। –

+0

नोट करें कि जब आप पहली बार इसे बनाते हैं तो आपको $ हेडर के माध्यम से चलाने की आवश्यकता होगी ताकि यह सुनिश्चित किया जा सके कि आप "अज्ञात" जैसे शीर्षक वाले डमी डेटा के बिना कोई कॉलम दें। $ x या सरणी गठबंधन अलग-अलग लंबाई – Titan

27

पीएचपी आप SplFileObject भीतर की आवश्यकता है उसका पहले से ही 99,9% प्रदान करता है, आप इसे से बढ़ा कर लापता 0,1% जोड़ें। निम्न उदाहरण में CSVFile यह तक फैली हुई है:

$csv = new CSVFile('../data/test.csv'); 

foreach ($csv as $line) 
{ 
    var_dump($line); 
} 
अपने उदाहरण डेटा के साथ

:

class CSVFile extends SplFileObject 
{ 
    private $keys; 

    public function __construct($file) 
    { 
     parent::__construct($file); 
     $this->setFlags(SplFileObject::READ_CSV); 
    } 

    public function rewind() 
    { 
     parent::rewind(); 
     $this->keys = parent::current(); 
     parent::next(); 
    } 

    public function current() 
    { 
     return array_combine($this->keys, parent::current()); 
    } 

    public function getKeys() 
    { 
     return $this->keys; 
    } 
} 

आप इसे इस तरह करते हैं,:

array(3) { 
    ["Make"]=> string(5) "Chevy" 
    ["Model"]=> string(4) "1500" 
    ["Note"]=> string(6) "loaded" 
} 
array(3) { 
    ["Make"]=> string(5) "Chevy" 
    ["Model"]=> string(4) "2500" 
    ["Note"]=> string(0) "" 
} 
array(3) { 
    ["Make"]=> string(5) "Chevy" 
    ["Model"]=> string(0) "" 
    ["Note"]=> string(6) "loaded" 
} 

CSVFile के रूप में परिभाषित किया गया है निम्नलिखित विवरण अच्छी तरह से encapsulated दूर हैं। इसके अतिरिक्त current() फ़ंक्शन के अंदर त्रुटियों (जैसे गिनती मेल नहीं) के साथ सौदा करना अधिक आसान है, इसलिए डेटा का उपयोग करने वाले कोड को इससे निपटने की आवश्यकता नहीं है।

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

हालांकि उदाहरण दिया फिर से Usablity के मामले में कम है। SplFileObject से विस्तार करने के बजाय इसे एकत्र करने के लिए काफी बेहतर है:

class KeyedArrayIterator extends IteratorIterator 
{ 
    private $keys; 

    public function rewind() 
    { 
     parent::rewind(); 
     $this->keys = parent::current(); 
     parent::next(); 
    } 

    public function current() 
    { 
     return array_combine($this->keys, parent::current()); 
    } 

    public function getKeys() 
    { 
     return $this->keys; 
    } 
} 

कोड समान है, लेकिन जानकारी है कि निर्माता में समझाया गया बाहर छोड़ दिया जाता। यह कमी इस प्रकार का अधिक व्यापक रूप से उपयोग करने की अनुमति देती है, उदा।साथ (लेकिन साथ न केवल) ने कहा SplFileObject:

class CSVFile extends KeyedArrayIterator 
{ 
    /** 
    * @param string $file 
    */ 
    public function __construct($file) 
    { 
     parent::__construct(new SplFileObject($file)); 
     $this->setFlags(SplFileObject::READ_CSV); 
    } 
} 

के लिए धन्यवाद:

$file = new SplFileObject('../data/test.csv'); 
$file->setFlags($file::READ_CSV); 

$csv = new KeyedArrayIterator($file); 

foreach ($csv as $line) { 
    var_dump($line); 
} 

है कि अब भी अत्यधिक शब्द लगता है, इसे फिर से इसे फिर से एक अच्छे मुखौटा देने के लिए लपेटा जा सकता है मानक सजावट-क्षमता ट्रैवर्सबल इटरेटर, के पहले उदाहरण से मूल कन्स्ट्रक्टर कोड CSVFile को केवल 100% कॉपी किया जा सकता है।

$csv = new CSVFile('../data/test.csv'); 

foreach ($csv as $line) { 
    var_dump($line); 
} 

तो बस एक त्वरित रिफैक्टरिंग अधिक कोड-पुन: उपयोग की अनुमति के लिए:

यह पिछले इसके अलावा यह भी कहा कि का उपयोग करताCSVFile इटरेटर बरकरार मूल कोड रखने के लिए अनुमति देता है। आपको KeyedArrayIterator मुफ्त में मिलता है। इस कोड के साथ

+1

बहुत अच्छी होगी ...... –

+0

क्या आप रुचि के लिए इस हैंडललेस सीएसवी को संभालने का तरीका सोच सकते हैं? –

+1

यह बहुत सीधी आगे है: इसके बजाय 'रिवाइंड' फ़ंक्शन और पास कुंजी को छोड़ दें। यदि आपको अधिक लचीलापन की आवश्यकता है, तो मैंने कुछ कोड को उदाहरण के साथ एक गिस्ट में रखा है, लेकिन यह अभी भी सुंदर अल्फा है: https://gist.github.com/4153380 – hakre

0

प्रयास करें:

$query = "SELECT * FROM datashep_AMS.COMPLETE_APPLICATIONS"; 
$export= mysql_query($query); 
$first = true; 
$temp = $export[0]; 
//echo "<pre>"; print_r($first); exit; 

header('Content-Type: text/csv'); 
header('Content-Disposition: attachment; filename=file.csv'); 
header('Pragma: no-cache'); 
header("Expires: 0"); 

$outstream = fopen("php://output", "w"); 



foreach($export as $result) 
{ 
    if($first){ 
     $titles = array(); 
     foreach($temp as $key=>$val){ 
      $titles[] = $key; 
     } 
     //print_r ($titles);exit; 
     fputcsv($outstream, $titles); 
    } 
    $first = false; 
    fputcsv($outstream, $result); 
} 

fclose($outstream); 

धन्यवाद

2
function processCsv($absolutePath) 
{ 
    $csv = array_map('str_getcsv', file($absolutePath)); 
    $headers = $csv[0]; 
    unset($csv[0]); 
    $rowsWithKeys = []; 
    foreach ($csv as $row) { 
     $newRow = []; 
     foreach ($headers as $k => $key) { 
      $newRow[$key] = $row[$k]; 
     } 
     $rowsWithKeys[] = $newRow; 
    } 
    return $rowsWithKeys; 
} 
1

इस बिंदु पर मैं यह सोचते कर रहा हूँ आप पहले से ही समस्या हल हो जाती है, लेकिन सोचा था कि मैं इस के चारों ओर एक सुझाव रास्ते में फेंक होता गया है

$row = 1; 
$array = array(); 
$marray = array(); 
$handle = fopen('file.csv', 'r'); 
if ($handle !== FALSE) { 
    while (($data = fgetcsv($handle, 0, ',')) !== FALSE) { 
     if ($row === 1) { 
      $num = count($data); 
      for ($i = 0; $i < $num; $i++) { 
       array_push($array, $data[$i]); 
      } 
     } 
     else { 
      $c = 0; 
      foreach ($array as $key) { 
       $marray[$row - 1][$key] = $data[$c]; 
       $c++; 
      } 
     } 
     $row++; 
    } 
    echo '<pre>'; 
    print_r($marray); 
    echo '</pre>'; 
} 
4
$csv_data = array_map('str_getcsv', file('Book.csv'));// reads the csv file in php array 
$csv_header = $csv_data[0];//creates a copy of csv header array 
unset($csv_data[0]);//removes the header from $csv_data since no longer needed 
foreach($csv_data as $row){ 
    $row = array_combine($csv_header, $row);// adds header to each row as key 
    var_dump($row);//do something here with each row 
} 
:, शायद सबसे अच्छा/सबसे सुरुचिपूर्ण समाधान नहीं है, लेकिन यह काम कर देता है
0

इस

$csv = array_map("str_getcsv", file('file.csv', FILE_SKIP_EMPTY_LINES));  
$header = array_shift($csv); // get header from array 

foreach ($csv as $key => $value) {  
    $csv[$key] = array_combine($header, $value); 
    var_dump($csv[$key]['Model']); 
} 

var_dump($csv); 
0

टिम कूपर ऊपर की जवाब में प्रयास करें,

$all_rows = array(); 
$header = null; 
while ($row = fgetcsv($file)) { 
    if ($header === null) { 
     $header = $row; 
     continue; 
    } 
    $all_rows[] = array_combine($header, $row); 
} 

के बजाय मैं कोड, एक और अधिक सुरुचिपूर्ण और कुशल तरीके से होगा:

$all_rows = array(); 
$header = fgetcsv($file); 
while ($row = fgetcsv($file)) { 
    $all_rows[] = array_combine($header, $row); 
}