PHP और fgetcsv फ़ंक्शन का उपयोग करके CSV फ़ाइल से एक सरणी कैसे बनाएं


106

क्या कोई कृपया fgetcsv का उपयोग करके CSV फ़ाइल से एक सरणी बनाने के लिए एक कोड प्रदान कर सकता है?

मैंने एक सरल CSV फ़ाइल से एक सरणी बनाने के लिए निम्न कोड का उपयोग किया है, लेकिन यह सही काम नहीं करता है जब मेरे किसी एक फ़ील्ड में एक से अधिक अल्पविराम होते हैं - जैसे पते।

$lines =file('CSV Address.csv');

foreach($lines as $data)
{
list($name[],$address[],$status[])
= explode(',',$data);
}

* इसके अलावा, str_getcsv मेरी होस्टिंग सेवा द्वारा समर्थित नहीं है।

उपरोक्त कोड निम्नलिखित CSV फ़ाइल उदाहरण के साथ काम नहीं करता है। पहला कॉलम नाम है, दूसरा कॉलम एड्रेस है, तीसरा कॉलम वैवाहिक स्थिति है।

Scott L. Aranda,"123 Main Street, Bethesda, Maryland 20816",Single
Todd D. Smith,"987 Elm Street, Alexandria, Virginia 22301",Single
Edward M. Grass,"123 Main Street, Bethesda, Maryland 20816",Married
Aaron G. Frantz,"987 Elm Street, Alexandria, Virginia 22301",Married
Ryan V. Turner,"123 Main Street, Bethesda, Maryland 20816",Single

2
PHP 5.2 एह के साथ अटक गया? मैं आपके लिए महसूस करता हूं, मैं अपने होस्टिंग प्रदाता के साथ एक ही नाव में हूं।
एडम एफ

आप इस सहायक का उपयोग कर सकते हैं: github.com/rap2hpoutre/csv-to-associative-array
rap-2-h

जवाबों:


179

जैसा कि आपने अपने शीर्षक में कहा, fgetcsv जाने का रास्ता है। यह प्रयोग करने में आसान है।

$file = fopen('myCSVFile.csv', 'r');
while (($line = fgetcsv($file)) !== FALSE) {
  //$line is an array of the csv elements
  print_r($line);
}
fclose($file);

आप मामले में fopen()विफल होने पर अधिक त्रुटि जाँच करना चाहते हैं , लेकिन यह एक लाइन में CSV फ़ाइल लाइन को पढ़ने और लाइन को एक सरणी में पार्स करने के लिए काम करता है।


धन्यवाद डेव लेकिन आपका उदाहरण केवल निम्नलिखित तीन पदों के साथ एक सरणी प्रदान करता है: $ लाइन [0], $ लाइन [1], और $ लाइन [2]। यह पहली पंक्ति के लिए ठीक है, लेकिन मुझे 2, 3, 4, आदि लाइनों के लिए अलग-अलग स्थिति बनाने की आवश्यकता है। इस तरह मैं अलग से लाइनों में फेरबदल कर सकता हूं। आशा है कि समझ में आता है
थॉमस

7
@ थोमस यदि आपको नाम, पते और स्टेटस की एक सरणी की आवश्यकता है, तो आप बस वही कर सकते हैं जो आप ऊपर कर रहे हैं:list($names[], $addresses[], $statuses[]) = $line;
डेव

फिर से धन्यवाद डेव! वह मुझे ट्रिप कर रहा था।
थॉमस

मुझे इस फ़ंक्शन के बारे में एक प्रश्न मिला, अगर सीएसवी फ़ील्ड में से एक में एक नई लाइन है, तो क्या यह वर्तमान में एकल रिकॉर्ड के रूप में लाइन को पार्स करेगा? या इसके बदले दो (मंगली) रिकॉर्ड लौटाएगा?
एलिक्स एक्सल

हमें आखिर में फेकलॉग की आवश्यकता क्यों है?
क्रोधित कीवी

55

मुझे लगता है कि str_getcsv () सिंटैक्स बहुत क्लीनर है, इसे CSV को फ़ाइल सिस्टम में संग्रहीत करने की भी आवश्यकता नहीं है।

$csv = str_getcsv(file_get_contents('myCSVFile.csv'));

echo '<pre>';
print_r($csv);
echo '</pre>';

या लाइन समाधान द्वारा एक पंक्ति के लिए:

$csv = array();
$lines = file('myCSVFile.csv', FILE_IGNORE_NEW_LINES);

foreach ($lines as $key => $value)
{
    $csv[$key] = str_getcsv($value);
}

echo '<pre>';
print_r($csv);
echo '</pre>';

या बिना str_getcsv () के साथ लाइन समाधान द्वारा एक पंक्ति के लिए:

$csv = array();
$file = fopen('myCSVFile.csv', 'r');

while (($result = fgetcsv($file)) !== false)
{
    $csv[] = $result;
}

fclose($file);

echo '<pre>';
print_r($csv);
echo '</pre>';

2
FYI करें: str_getcsv () केवल PHP 5.3.0 पर उपलब्ध है। जिस प्रोजेक्ट पर मैं काम कर रहा हूं, वह 1 संस्करण DOH से छूट गया है! (हम 5.2.9 एटीएम का उपयोग कर रहे हैं)।
जिम फोर्ड

यह उत्कृष्ट है, जब तक कि आपके पास स्मृति प्रतिबंध नहीं हैं। Fgetcsv समाधान किसी भी हार्डवेयर कॉन्फ़िगरेशन के साथ काम करता है।
Sp4cecat

4
सावधान! str_getcsv के साथ एक बग है जो इसे लाइन एंडिंग को अनदेखा करता है: bugs.php.net/bug.php?id=55763&edit=1
RJD22

ध्यान दें कि आप ऐसा कर सकते हैं: जबकि (; feof ($ फ़ाइल)) {$ csv [] = fgetcsv ($ फ़ाइल); } बजाय (जबकि ($ परिणाम = fgetcsv ($ फ़ाइल))! == झूठा) {$ csv [] = $ परिणाम; }
डेविड जी

23

मैंने एक फ़ंक्शन बनाया है जो एक csv स्ट्रिंग को एक अरै में बदल देगा। फ़ंक्शन जानता है कि विशेष वर्णों से कैसे बचना है, और यह संलग्नक वर्ण के साथ या बिना काम करता है।

$dataArray = csvstring_to_array( file_get_contents('Address.csv'));

मैंने इसे आपके सीएसवी नमूने के साथ आज़माया और यह उम्मीद के मुताबिक काम करता है!

function csvstring_to_array($string, $separatorChar = ',', $enclosureChar = '"', $newlineChar = "\n") {
    // @author: Klemen Nagode
    $array = array();
    $size = strlen($string);
    $columnIndex = 0;
    $rowIndex = 0;
    $fieldValue="";
    $isEnclosured = false;
    for($i=0; $i<$size;$i++) {

        $char = $string{$i};
        $addChar = "";

        if($isEnclosured) {
            if($char==$enclosureChar) {

                if($i+1<$size && $string{$i+1}==$enclosureChar){
                    // escaped char
                    $addChar=$char;
                    $i++; // dont check next char
                }else{
                    $isEnclosured = false;
                }
            }else {
                $addChar=$char;
            }
        }else {
            if($char==$enclosureChar) {
                $isEnclosured = true;
            }else {

                if($char==$separatorChar) {

                    $array[$rowIndex][$columnIndex] = $fieldValue;
                    $fieldValue="";

                    $columnIndex++;
                }elseif($char==$newlineChar) {
                    echo $char;
                    $array[$rowIndex][$columnIndex] = $fieldValue;
                    $fieldValue="";
                    $columnIndex=0;
                    $rowIndex++;
                }else {
                    $addChar=$char;
                }
            }
        }
        if($addChar!=""){
            $fieldValue.=$addChar;

        }
    }

    if($fieldValue) { // save last field
        $array[$rowIndex][$columnIndex] = $fieldValue;
    }
    return $array;
}


14

पुराना सवाल है, लेकिन अभी भी PHP 5.2 उपयोगकर्ताओं के लिए प्रासंगिक है। str_getcsv PHP 5.3 से उपलब्ध है। मैंने एक छोटा सा फंक्शन लिखा है जो fgetcsv के साथ ही काम करता है।

नीचे https://gist.github.com/4152628 से मेरा कार्य है :

function parse_csv_file($csvfile) {
    $csv = Array();
    $rowcount = 0;
    if (($handle = fopen($csvfile, "r")) !== FALSE) {
        $max_line_length = defined('MAX_LINE_LENGTH') ? MAX_LINE_LENGTH : 10000;
        $header = fgetcsv($handle, $max_line_length);
        $header_colcount = count($header);
        while (($row = fgetcsv($handle, $max_line_length)) !== FALSE) {
            $row_colcount = count($row);
            if ($row_colcount == $header_colcount) {
                $entry = array_combine($header, $row);
                $csv[] = $entry;
            }
            else {
                error_log("csvreader: Invalid number of columns at line " . ($rowcount + 2) . " (row " . ($rowcount + 1) . "). Expected=$header_colcount Got=$row_colcount");
                return null;
            }
            $rowcount++;
        }
        //echo "Totally $rowcount rows found\n";
        fclose($handle);
    }
    else {
        error_log("csvreader: Could not read CSV \"$csvfile\"");
        return null;
    }
    return $csv;
}

रिटर्न

CSV पढ़ना शुरू करें

Array
(
    [0] => Array
        (
            [vid] => 
            [agency] => 
            [division] => Division
            [country] => 
            [station] => Duty Station
            [unit] => Unit / Department
            [grade] => 
            [funding] => Fund Code
            [number] => Country Office Position Number
            [wnumber] => Wings Position Number
            [title] => Position Title
            [tor] => Tor Text
            [tor_file] => 
            [status] => 
            [datetime] => Entry on Wings
            [laction] => 
            [supervisor] => Supervisor Index Number
            [asupervisor] => Alternative Supervisor Index
            [author] => 
            [category] => 
            [parent] => Reporting to Which Position Number
            [vacant] => Status (Vacant / Filled)
            [index] => Index Number
        )

    [1] => Array
        (
            [vid] => 
            [agency] => WFP
            [division] => KEN Kenya, The Republic Of
            [country] => 
            [station] => Nairobi
            [unit] => Human Resources Officer P4
            [grade] => P-4
            [funding] => 5000001
            [number] => 22018154
            [wnumber] => 
            [title] => Human Resources Officer P4
            [tor] => 
            [tor_file] => 
            [status] => 
            [datetime] => 
            [laction] => 
            [supervisor] => 
            [asupervisor] => 
            [author] => 
            [category] => Professional
            [parent] => 
            [vacant] => 
            [index] => xxxxx
        )
) 

Btw, आप वैकल्पिक पैरामीटर्स को बदलने के लिए fimcsv में जोड़ सकते हैं सीमांकक, बाड़े के चरित्र आदि
मनु मंजुनाथ

4

इसे इस्तेमाल करे..

function getdata($csvFile){
    $file_handle = fopen($csvFile, 'r');
    while (!feof($file_handle) ) {
        $line_of_text[] = fgetcsv($file_handle, 1024);
    }
    fclose($file_handle);
    return $line_of_text;
}


// Set path to CSV file
$csvFile = 'test.csv';

$csv = getdata($csvFile);
echo '<pre>';
print_r($csv);
echo '</pre>';

Array
(
    [0] => Array
        (
            [0] => Project
            [1] => Date
            [2] => User
            [3] => Activity
            [4] => Issue
            [5] => Comment
            [6] => Hours
        )

    [1] => Array
        (
            [0] => test
            [1] => 04/30/2015
            [2] => test
            [3] => test
            [4] => test
            [5] => 
            [6] => 6.00
        ));

3

यह फ़ंक्शन सरणी कुंजियों के रूप में हेडर मानों के साथ सरणी लौटाएगा।

function csv_to_array($file_name) {
        $data =  $header = array();
        $i = 0;
        $file = fopen($file_name, 'r');
        while (($line = fgetcsv($file)) !== FALSE) {
            if( $i==0 ) {
                $header = $line;
            } else {
                $data[] = $line;        
            }
            $i++;
        }
        fclose($file);
        foreach ($data as $key => $_value) {
            $new_item = array();
            foreach ($_value as $key => $value) {
                $new_item[ $header[$key] ] =$value;
            }
            $_data[] = $new_item;
        }
        return $_data;
    }

3

सही कुंजियों के साथ एक सरणी प्राप्त करने के लिए, आप यह कोशिश कर सकते हैं:

// Open file
$file = fopen($file_path, 'r');

// Headers
$headers = fgetcsv($file);

// Rows
$data = [];
while (($row = fgetcsv($file)) !== false)
{
    $item = [];
    foreach ($row as $key => $value)
        $item[$headers[$key]] = $value ?: null;
    $data[] = $item;
}

// Close file
fclose($file);

1

कृपया एक सीधे पंक्तियों पैरामीटर के साथ बढ़ाया, @knagode से फ़ंक्शन के लिंक के नीचे फिन करें। https://gist.github.com/gabrieljenik/47fc38ae47d99868d5b3#file-csv_to_array

<?php
    /**
     * Convert a CSV string into an array.
     * 
     * @param $string
     * @param $separatorChar
     * @param $enclosureChar
     * @param $newlineChar
     * @param $skip_rows
     * @return array
     */
    public static function csvstring_to_array($string, $skip_rows = 0, $separatorChar = ';', $enclosureChar = '"', $newlineChar = "\n") {
        // @author: Klemen Nagode 
        // @source: http://stackoverflow.com/questions/1269562/how-to-create-an-array-from-a-csv-file-using-php-and-the-fgetcsv-function
        $array = array();
        $size = strlen($string);
        $columnIndex = 0;
        $rowIndex = 0;
        $fieldValue="";
        $isEnclosured = false;
        for($i=0; $i<$size;$i++) {

            $char = $string{$i};
            $addChar = "";

            if($isEnclosured) {
                if($char==$enclosureChar) {

                    if($i+1<$size && $string{$i+1}==$enclosureChar){
                        // escaped char
                        $addChar=$char;
                        $i++; // dont check next char
                    }else{
                        $isEnclosured = false;
                    }
                }else {
                    $addChar=$char;
                }
            }else {
                if($char==$enclosureChar) {
                    $isEnclosured = true;
                }else {

                    if($char==$separatorChar) {

                        $array[$rowIndex][$columnIndex] = $fieldValue;
                        $fieldValue="";

                        $columnIndex++;
                    }elseif($char==$newlineChar) {
                        echo $char;
                        $array[$rowIndex][$columnIndex] = $fieldValue;
                        $fieldValue="";
                        $columnIndex=0;
                        $rowIndex++;
                    }else {
                        $addChar=$char;
                    }
                }
            }
            if($addChar!=""){
                $fieldValue.=$addChar;

            }
        }

        if($fieldValue) { // save last field
            $array[$rowIndex][$columnIndex] = $fieldValue;
        }


        /**
         * Skip rows. 
         * Returning empty array if being told to skip all rows in the array.
         */ 
        if ($skip_rows > 0) {
            if (count($array) == $skip_rows)
                $array = array();
            elseif (count($array) > $skip_rows)
                $array = array_slice($array, $skip_rows);           

        }

        return $array;
    }

1
स्टैकओवरफ़्लो में, कृपया केवल एक लिंक प्रदान करने के बजाय अधिक विस्तृत करें।
पॉल लो

1

मैं इस सुंदर बुनियादी कोड के साथ आया था। मुझे लगता है कि यह किसी के लिए भी उपयोगी हो सकता है।

$link = "link to the CSV here"
$fp = fopen($link, 'r');

while(($line = fgetcsv($fp)) !== FALSE) {
    foreach($line as $key => $value) {
        echo $key . " - " . $value . "<br>";
    }
}


fclose($fp);

1

यदि आप चाहते हैं कि प्रत्येक पंक्ति एक सरणी में हो, और प्रत्येक पंक्ति सरणी में पंक्ति में हो:

$file = fopen('csvFile.csv', 'r');              // Open the file                     
while (($line = fgetcsv($file)) !== FALSE) {    // Read one line
    $array[] =$line;                            // Add the line in the main array
}
echo '<pre>';
print_r($array);   //print it out
echo '</pre>'; 
fclose($file);

0

इस कोड को आज़माएं:

function readCsv($file)
{
    if (($handle = fopen($file, 'r')) !== FALSE) {
        while (($lineArray = fgetcsv($handle, 4000)) !== FALSE) {
            print_r(lineArray);
        }
        fclose($handle);
    }
}

1
लागू किए गए सटीक उत्तर प्रश्नकर्ता को पोस्ट करने का क्या कारण है?
पाइनपैन

0
 function csvToArray($path)
{
    try{
        $csv = fopen($path, 'r');
        $rows = [];
        $header = [];
        $index = 0;
        while (($line = fgetcsv($csv)) !== FALSE) {
            if ($index == 0) {
                $header = $line;
                $index = 1;
            } else {
                $row = [];
                for ($i = 0; $i < count($header); $i++) {
                    $row[$header[$i]] = $line[$i];
                }
                array_push($rows, $row);
            }
        }
        return $rows;
    }catch (Exception $exception){
        return false;
    }
}

0
convertToArray(file_get_content($filename));

function convertToArray(string $content): array
{
   $data = str_getcsv($content,"\n");
   array_walk($data, function(&$a) use ($data) {
       $a = str_getcsv($a);
   });

   return $data;
}

प्रश्न क्या है?
स्पंजपब्लो

" पूरी तरह से कोड-आधारित उत्तरों की व्याख्या करना " देखें । हालांकि यह तकनीकी रूप से सही हो सकता है लेकिन यह नहीं बताता है कि यह समस्या को हल करता है या चयनित उत्तर होना चाहिए। हमें समस्या को हल करने में मदद करने के अलावा शिक्षित करना चाहिए।
द टिन मैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.