PHP kullanarak bir CSV dosyasından bir dizi ve fgetcsv fonksiyonu oluşturmak için nasıl

4 Cevap php

Birisi lütfen fgetcsv kullanarak bir CSV dosyasından bir dizi oluşturmak için bir kod verebilir misiniz?

Ben basit bir CSV dosyasından bir dizi oluşturmak için aşağıdaki kodu kullandım, ama benim alanlardan biri birden çok virgül olduğunda doğru çalışmıyor - adresler gibi.

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

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

* Ayrıca, str_getcsv benim barındırma hizmeti tarafından desteklenmiyor.

Yukarıdaki kod aşağıdaki CSV dosyası örneği ile çalışmaz. İlk sütun, ikinci sütun adresi, isim, üçüncü sütun medeni durumu.

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

4 Cevap

Eğer başlığında söylediğim gibi, fgetcsv gitmek için yoludur. Kullanımı oldukça lanetlemek kolaydır.

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

Oraya fopen() başarısız durumda kontrol daha fazla hata koymak isteyeceksiniz, ama bu çizgi ile bir CSV dosyası satır satır okuyacak ve bir diziye satır ayrıştırmak için çalışır.

Ben str_getcsv () sözdizimi de dosya sisteminde saklanacak CSV gerektirmez, daha temiz olduğunu düşünüyorum.

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

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

Ya hattı çözümü ile bir satır için:

$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>';

Ya da hayır str_getcsv ile hattı çözümü ile bir hat için ():

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

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

fclose($file);

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

Ben diziye csv dize dönüştürür fonksiyonu oluşturduk. Fonksiyonu, özel karakter kaçmak için nasıl bilir veya muhafaza karakter olmadan çalışıyor ...

Ben csv numune ile denedim ve beklendiği gibi çalışır!

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;
}

Eski bir soru, ama PHP 5.2 kullanıcıları için hala geçerlidir. str_getcsv PHP 5.3 edinilebilir. Ben fgetcsv kendisi ile çalışan küçük bir fonksiyon yazdım.

Below is my function from 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;
}