পিএইচপি এবং fgetcsv ফাংশন ব্যবহার করে কীভাবে একটি CSV ফাইল থেকে অ্যারে তৈরি করবেন


106

কেউ কি দয়া করে fgetcsv ব্যবহার করে CSV ফাইল থেকে একটি অ্যারে তৈরি করতে একটি কোড সরবরাহ করতে পারেন?

আমি একটি সাধারণ সিএসভি ফাইল থেকে একটি অ্যারে তৈরি করতে নিম্নলিখিত কোডটি ব্যবহার করেছি, তবে আমার কোনও ক্ষেত্রে একাধিক কমা - যেমন ঠিকানা হিসাবে ঠিক কাজ করে না।

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

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

* এছাড়াও, str_getcsv আমার হোস্টিং পরিষেবা দ্বারা সমর্থিত নয়।

উপরের কোডটি নিম্নলিখিত সিএসভি ফাইল উদাহরণ সহ কাজ করে না। প্রথম কলামটির নাম, দ্বিতীয় কলাম ঠিকানা, তৃতীয় কলামটি বৈবাহিক অবস্থা।

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
পিএইচপি 5.2 আট আটকা আছে? আমি আপনার জন্য অনুভব করছি, আমি আমার হোস্টিং সরবরাহকারীর সাথে একই নৌকায় আছি।
আদম এফ

উত্তর:


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()ব্যর্থ হওয়ার ক্ষেত্রে আপনি আরও ত্রুটি পরীক্ষা করতে চাইবেন , তবে এটি লাইনে সিএসভি ফাইল লাইনটি পড়তে এবং লাইনটিকে একটি অ্যারেতে পার্স করতে কাজ করে।


ধন্যবাদ ডেভ তবে আপনার উদাহরণটি কেবলমাত্র নিম্নলিখিত তিনটি অবস্থানের সাথে একটি অ্যারে সরবরাহ করে: $ লাইন [0], $ লাইন [1] এবং $ লাইন [2]। প্রথম লাইনের জন্য এটি ঠিক আছে, তবে আমার ২ য়, তৃতীয়, ৪ র্থ ইত্যাদি লাইনের জন্য আলাদা অবস্থান তৈরি করতে হবে। এইভাবে আমি পৃথকভাবে লাইনগুলি হেরফের করতে পারি। আশা করি এটি উপলব্ধি করা হয়েছে
টমাস

7
@ থমাস যদি আপনার নাম, ঠিকানা এবং স্ট্যাটাসগুলির একটি অ্যারের প্রয়োজন হয় তবে আপনি উপরে যা করছেন তা কেবল আপনি করতে পারেন: list($names[], $addresses[], $statuses[]) = $line;
ডেভ দেলং

ধন্যবাদ আবার ডেভ! এটা আমাকে ট্রিপ আপ ছিল।
থমাস

আমি এই ফাংশনটি সম্পর্কে একটি প্রশ্ন পেয়েছি, যদি কোনও সিএসভি ক্ষেত্রের মধ্যে একটি নতুন লাইন থাকে তবে এটি বর্তমানে লাইনটিকে একটি একক রেকর্ড হিসাবে পার্স করবে? অথবা এটি পরিবর্তে দুটি (মাঙ্গাল) রেকর্ডটি ফেরত দেবে?
অ্যালিক্স অ্যাক্সেল

কেন আমাদের শেষে fclose প্রয়োজন?
ক্রুদ্ধ কিউই

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
এফওয়াইআই: str_getcsv () কেবলমাত্র পিএইচপি 5.3.0 থেকে উপলব্ধ। আমি যে প্রকল্পে কাজ করছি এটি 1 সংস্করণ ডিওএইচ দ্বারা মিস হয়েছে! (আমরা 5.2.9 এটিএম ব্যবহার করছি)।
জিম ফোর্ড

এটি দুর্দান্ত, যদি না আপনার স্মৃতির সীমাবদ্ধতা থাকে। Fgetcsv সমাধান যে কোনও হার্ডওয়্যার কনফিগারেশনের সাথে কাজ করে।
Sp4cecat

4
হুঁশিয়ার! আরআর_জেটসিএসভি সহ একটি বাগ রয়েছে যা এটিকে লাইনের শেষটিকে
আরজেডি 22

আপনি যেটি করতে পারেন তা নোট করুন: যখন (! Feof ($ ফাইল)) {$ csv [] = fgetcsv ($ ফাইল); while এর পরিবর্তে (($ ফলাফল = fgetcsv ($ ফাইল))! == মিথ্যা) $ $ csv [] = $ ফলাফল; }
ডেভিড জি

23

আমি একটি ফাংশন তৈরি করেছি যা একটি সিএসভি স্ট্রিংকে অ্যারেতে রূপান্তর করবে। ফাংশনটি কীভাবে বিশেষ অক্ষরগুলি থেকে বাঁচতে জানে এবং এটি ঘের অক্ষরের সাথে বা ছাড়াই কাজ করে।

$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

পুরানো প্রশ্ন, তবে এখনও পিএইচপি 5.2 ব্যবহারকারীর জন্য প্রাসঙ্গিক। str_getcsv পিএইচপি 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;
}

রিটার্নস

সিএসভি পড়া শুরু করুন

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
        )
) 

বিটিডব্লিউ, আপনি ডিলিমেটার, ঘেরের চরিত্র ইত্যাদি পরিবর্তনের জন্য fgetcsv এ alচ্ছিক প্যারাম যুক্ত করতে পারেন
মানু মঞ্জুনাথ

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

দয়া করে @knavode থেকে ফাংশনটির লিঙ্কের নীচে ফিন করুন, এড়িয়ে যাওয়া সারিগুলির প্যারামিটার দিয়ে বর্ধিত করুন। 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;
}

প্রশ্নটি কি?
স্পঞ্জপ্যাবলো

" সম্পূর্ণ কোড-ভিত্তিক উত্তর ব্যাখ্যা করা " দেখুন। যদিও এটি প্রযুক্তিগতভাবে সঠিক হতে পারে এটি কেন এটি সমস্যার সমাধান করে বা নির্বাচিত উত্তর হওয়া উচিত তা ব্যাখ্যা করে না। সমস্যা সমাধানে সহায়তা করার পাশাপাশি আমাদের শিক্ষিত করা উচিত।
টিন ম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.