복붙노트

PHP와 fgetcsv 함수를 사용하여 CSV 파일에서 배열을 만드는 법

PHP

PHP와 fgetcsv 함수를 사용하여 CSV 파일에서 배열을 만드는 법

누군가가 친절하게 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

해결법

  1. ==============================

    1.당신이 당신의 제목에서 말했듯이, fgetcsv가가는 길입니다. 꽤 사용하기 쉽습니다.

    당신이 당신의 제목에서 말했듯이, 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 파일을 한 줄씩 읽고 해당 줄을 배열로 파싱하는 데 사용됩니다.

  2. ==============================

    2.나는 str_getcsv () 문법이 훨씬 깔끔하고, CSV가 파일 시스템에 저장 될 필요가 없다고 생각한다.

    나는 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>';
    
  3. ==============================

    3.CSV 문자열을 배열로 변환하는 함수를 만들었습니다. 이 함수는 특수 문자를 이스케이프하는 방법을 알고 있으며 인클로저 문자를 사용하거나 사용하지 않고 작동합니다.

    CSV 문자열을 배열로 변환하는 함수를 만들었습니다. 이 함수는 특수 문자를 이스케이프하는 방법을 알고 있으며 인클로저 문자를 사용하거나 사용하지 않고 작동합니다.

    나는 당신의 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;
    }
    
  4. ==============================

    4.이전 질문이지만 PHP 5.2 사용자에게도 적합합니다. str_getcsv는 PHP 5.3에서 사용할 수 있습니다. 필자는 fgetcsv 자체에서 작동하는 작은 함수를 작성했습니다.

    이전 질문이지만 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
            )
    ) 
    
  5. ==============================

    5.

    $arrayFromCSV =  array_map('str_getcsv', file('/path/to/file.csv'));
    
  6. ==============================

    6.이 시도..

    이 시도..

    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
            ));
    
  7. ==============================

    7.오른쪽 키를 사용하여 배열을 가져 오려면 다음을 시도하십시오.

    오른쪽 키를 사용하여 배열을 가져 오려면 다음을 시도하십시오.

    // 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);
    
  8. ==============================

    8.skip rows 매개 변수로 향상된 @knagode 함수의 링크 아래에 고정하십시오. https://gist.github.com/gabrieljenik/47fc38ae47d99868d5b3#file-csv_to_array

    skip rows 매개 변수로 향상된 @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;
        }
    
  9. ==============================

    9.이 함수는 배열 값으로 배열 값을 배열로 반환합니다.

    이 함수는 배열 값으로 배열 값을 배열로 반환합니다.

    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;
        }
    
  10. ==============================

    10.이 코드를보십시오 :

    이 코드를보십시오 :

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

    11.나는이 아주 기본적인 코드를 생각해 냈다. 나는 그것이 누구에게나 유용 할 수 있다고 생각한다.

    나는이 아주 기본적인 코드를 생각해 냈다. 나는 그것이 누구에게나 유용 할 수 있다고 생각한다.

    $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);
    
  12. from https://stackoverflow.com/questions/1269562/how-to-create-an-array-from-a-csv-file-using-php-and-the-fgetcsv-function by cc-by-sa and MIT license