PHP: Nasıl birden çok sütun üste çift tırnak içine virgül kurtulabilirim?

6 Cevap php

6 Cevap

Beyler, PHP zaten bunun için bir işlevi vardır, fgetcsv (dosyalarından virgül sepparated değerleri almak)

<?php
$r = array();
$fh = fopen('test.txt','r');
while($t = fgetcsv($fh)) {
    $r[] = $t;
}
var_dump($r);

PHP4 döneminden beri var olduğu.

function csv_string_to_array($str){
$expr="/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/";
$results=preg_split($expr,trim($str));
return preg_replace("/^\"(.*)\"$/","$1",$results);
}

Yani hile yok.

Ne istediğiniz str_getcsv () fonksiyonudur. Bu olsa PHP5.3.0 + yalnızca kullanılabilir.

Ham değerler tek bir satırı bölmek için bu işlevi deneyin. Oldukça düzensiz CSV'ler ile baş etmeye çalışır

function csv_split( $src, $comma = ',', $esc = '\\' ){
    $a = array();
    while( $src ){
    	$c = $src{0};
    	switch( $c ){
    	// permit empty values
    	case ',':
    		$a[] = '';
    		$src = substr( $src, 1 );
    		continue 2;
    	// ignore whitespace
    	case ' ':
    	case "\t":
    		preg_match('/^\s+/', $src, $r );
    		$src = substr( $src, strlen($r[0]) );
    		continue 2;
    	// quoted values
    	case '"':
    	case "'":
    	case '`':
    		$reg = sprintf('/^%1$s((?:\\\\.|[^%1$s\\\\])*)%1$s\s*(?:,|$)/', $c );
    		break;
    	// naked values
    	default:
    		$reg = '/^((?:\\\\.|[^,\\\\])*)(?:,|$)/';
    		$c = ',';
    	}
    	if( preg_match( $reg, $src, $r ) ){
    		$a[] = empty($r[1]) ? '' : str_replace( '\\'.$c, $c, $r[1] );
    		$src = substr( $src, strlen($r[0]) );
    		continue;
    	}
    	// else fail
    	trigger_error("csv_split failure", E_USER_WARNING );
    	break;
    }
    return $a;
}

Bu sizin için çalışabilir:

$pieces = explode( '"', 'partname,2035, "this is, desc,ription",qty, "another, description",' );

// explode the ones we should split (will be even-# elements)
for ( $i=0; $i<= count($pieces); $i+=2 ) {
    $tmpArray 	= explode(",", $pieces[$i]);
    foreach($tmpArray as $value) {
    	if ( strlen(trim($value)) > 0 ) {
    		$finalArray[] = $value;
    	}
    }
}

// now add the ones we shouldn't split inside quotes (odd-# elements)
for ( $i=1; $i<= count($pieces); $i+=2 ) {
    if ( strlen(trim($pieces[$i])) > 0 ) {	
    	$finalArray[] = $pieces[$i];
    }
}

// show the result
echo "<pre>";
print_r($finalArray);
echo "<pre>";

Sorunun için genel çözüm basit koma ayrılmış veri toplayıp önce çizgiyi oluştururken ayırıcı karakteri kaçmak olacaktır.

define(SEPARATOR,',');
$dataField = str_replace(SEPARATOR,'BSLASH'.SEPARATOR,$dataField);

Pls (Ben bir ters eğik çizgi karakteri yazmaya çalışın ve ben onu :) kapatmak için nasıl anlamaya edemez zaman garip davranır gibi açıklama giriş kutusu benden daha zekidir) karakteri ters eğik çizgi BSLASH değiştirmek

Eğer 3. parti bir kaynaktan veri alırsanız tabii ki bu bir seçenek değil.