2013-10-09 1 views
0

\ je générer fichier SQL à partir du fichier CSV, mais ai quelques fichiers de chaîne avec des barres obliques et la valeur est comme:Comment garder backslash ou changer à NULL dans un fichier CSV pour générer un fichier SQL en PHP

"aaa", "\", 111, 222, "bbb", "\", 333 

La valeur entre « \ » sera généré comme une seule chaîne

'\", 111, 222, "bbb", "\', 333 

Mais j'espère garder « \ » comme il se doit d'être, ou le modifier à NULL, comme:

'NULL', 111, 222, 'bbb', 'NULL', 333 

Mon code est comme ceci:

while (($lineArr = fgetcsv($infile))!=FALSE){ 
foreach($lineArr as $line){ 
... 
if ($line == '\\"') 
$line = 'NULL'; 
... 
} 
} 

Cette dose ne fonctionnera pas. Je pense que $line =='\\"' n'est pas correct, mais je ne sais pas comment traiter toute la partie entre "\".

solution: Je d'abord changer le tableau en chaîne pour traiter le "" \ "', puis le changer en tableau pour un traitement ultérieur.

while (($lineArr = fgetcsv($infile))!=FALSE){ 
$string = implode(",", $lineArr); 
    if (strpos($string,',\",')){ 
     $sKeepSlash = str_replace(',\",', ",NULL,", $string); 
     $pLineArr = explode(',', $sKeepSlash); 
    } 
    foreach($lineArr as $line){ 
    ... 
} 
} 
+1

Pouvez-vous montrer le code que vous utilisez? – Perry

+0

Ajouter un autre \ avant donc il y a 2 barres obliques inverses, comme "\\" – naththedeveloper

+0

duplication possible de [Echapper pour CSV] (http://stackoverflow.com/questions/6325613/escaping-for-csv) – Martijn

Répondre

1

Utilisez fputcsv() pour écrire et fgetcsv() à lire.

trouvés ici: Escaping for CSV

+0

Mon fichier csv est téléchargé à partir d'un autre système, donc cela signifie que j'ai besoin d'abord d'utiliser fputcsv() pour créer un nouveau fichier csv et ensuite utiliser fgetcsv() pour le traiter? – zhihong

+0

Vous devriez être en mesure de traiter la première exécution si elles fournissent un flux valide. Essayez de faire un tour pour 'csv escape' – Martijn

0

Trouver la position pour les barres obliques premier. Par exemple, vous pouvez user array_keys.

cela retournera les positions des marqueurs. Vous pouvez ensuite l'utiliser pour combiner

$marker_positions = array_keys($array, "marker"); 
for ($position = $marker_positions[0]+1; $position < $marker_positions[0]; $position++) { 
    $single_string .= $array[$position]; 
} 
Questions connexes