Autor Zpráva
Medvídek
Profil
Zdravím,
mám CSVčko, hodnoty jsou v uvozovkách a odděleny středníkem. Myslel jsem si, že si udělám klasicky explode řádků \n a poté explode středníků. Do půlky CSV to funguje a pak se objeví v textu mezi uvozovkami taky \n a ten mi celou strukturu rozhodí.

echo "<pre>";
$data=array();
$file=file_get_contents("export.csv");
$file=explode("\n",$file);
foreach($file AS $k => $v){
 $obsah=explode(";",$v);
 foreach($obsah AS $key => $value){
  $data[$k][$key]=$value;
 }
}
print_r($data);


Dá se nějak u toho explode omezit, aby nebral hodnoty co jsou v uvozovkách?
Mike8748
Profil
Medvídek:
nebylo by jednodušši

$f=fopen('export.csv','r');
while ($radek=fgetcsv($f)) { $data[]=$radek; }
print_r($data);
Medvídek
Profil
Mike8748:
Aha, fgetcsv() jsem neznal, díky.

Já už se začal patlat s funkcí:
$hledat="/\n(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/";

$data=preg_split($hledat,trim($files));

return preg_replace("/^\"(.*)\"$/","$1",$results);


Tak vypadá, že to funguje, díky

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

function assocToXML ($theArray, $tabCount=2) {
   
    $tabCount++;
    $tabSpace = "";
    $extraTabSpace = "";
     for ($i = 0; $i<$tabCount; $i++) {
        $tabSpace .= "\t";
     }
    
     for ($i = 0; $i<$tabCount+1; $i++) {
        $extraTabSpace .= "\t";
     }

    foreach($theArray as $tag => $val) {
        if (!is_array($val)) {
            $theXML .= PHP_EOL.$tabSpace.'<'.$tag.'>'.$val.'</'.$tag.'>';
        } else {
            $tabCount++;
            $theXML .= PHP_EOL.$extraTabSpace.'<'.$tag.'>'.assocToXML($val, $tabCount);
            $theXML .= PHP_EOL.$extraTabSpace.'</'.$tag.'>';
        }
    }
              
return $theXML;
}

    $f=fopen('../lang/'.$nazev,'r');
    while ($radek=fgetcsv($f)) { $data[]=$radek; }
    
    foreach($data AS $key => $value){
     $v=csv_string_to_array($value[0]);
     $m=explode("|",$v[1]);
     foreach($m AS $ke => $val){
       
       if(count($m)==2) $d[$m[0]][$m[1]]=$v[0];
       if(count($m)==3) $d[$m[0]][$m[1]][$m[2]]=$v[0];
     }
     
    }
    $xml='<?xml version="1.0" encoding="UTF-8"?>';
    $xml.='<conf>';
    $xml.=assocToXML($d, 2);
    $xml.='</conf>';
    
    @file_put_contents("../lang/lang".$_POST["jazyk"].".xml", $xml);

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0