2010-02-22 6 views
0

Je suis en train de lire un 'type' de fichier csv et de l'exploser et de le stocker dans un tableau.Lire un CSV avec file_get_contents en PHP

Le fichier que je suis en train de lire a cette structure

Id,Log,Res,File 

mydb('Test1','log1','Pass','lo1.txt'). 
mydb('Test2','log2','Pass','lo2.txt'). 
mydb('Test3','log3','Pass','lo3.txt'). 

Maintenant, ce que je suis en train de faire est: lire le dernier enregistrement dans ma base de données, obtenir le nom, permet de dire que dans ce cas « Test1 » et Ensuite, je cherche dans mon fichier et où je peux trouver la position de 'Test1' et obtenir les lignes suivantes dans le fichier, extraire l'ID, s et l'ajouter à la base de données.

Je reçois la position de la chaîne désirée dans le fichier, mais je ne sais pas trop comment obtenir les lignes suivantes.

Voici mon code jusqu'à maintenant.

<?php 


    mysql_connect("localhost", "root", "") or die(mysql_error()); 
    mysql_select_db("testing") or die(mysql_error()); 



$result = mysql_query("select ID from table_1 order by S_no DESC limit 1") or die(mysql_error()); 
$row = mysql_fetch_array($result); 
$a = $row['ID']; 
echo 'Present Top Row is '.$a.'<br>'; 

$addresses = explode("\n", file_get_contents('\\\\fil1\\logs\\tes.pl')); 

    foreach($addresses as $val) 
    { 

    $pos = strstr($val, $a); 

    if ($pos === false) { 

    } else { 
     echo "The string <br> '$a' <br>was found in the string <br>'$val' <br>"; 
     echo " and exists at position <br>$pos<br>"; 


    } 

    } 

Répondre

0

Espérons que je vous ai bien compris. Si c'est le cas, vous pouvez simplement définir un drapeau une fois que l'objet est trouvé, puis exploser chaque ligne, puis sur un personnage. La deuxième valeur dans le tableau résultant doit alors contenir l'ID selon votre exemple.

$addresses = explode("\n", file_get_contents('\\\\fil1\\logs\\tes.pl')); 

$bFound = false; 
foreach($addresses as $val) 
{ 

    if (!$bFound) { 
     $pos = strstr($val, $a); 

     if ($pos === false) {   

     } else { 
      echo "The string <br> '$a' <br>was found in the string <br>'$val' <br>"; 
      echo " and exists at position <br>$pos<br>"; 
      $bFound = true; 
     } 
    } 
    else { 
     $aCols = explode("'", $val); 
     $sId = $aCols[1]; 
     // Now add Id as stored in $sId to DB here 
    } 


} 
0

Si id est censé être unique, le trafic entre le processus php et le serveur MySQL n'est pas le facteur limitant et vous devez analyser chaque ligne de toute façon, vous pourriez create a unique index et laisser MySQL décider si elle accepte le dossier ou non.

Exemple simple:

$pdo = new PDO('mysql:host=localhost;dbname=test', 'localonly', 'localonly'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$pdo->exec('CREATE TEMPORARY TABLE foo (Id varchar(16),Log varchar(16),Res varchar(16),File varchar(16), unique key(Id))'); 
$stmt = $pdo->prepare('INSERT IGNORE INTO foo (Id,Log,Res,File) VALUES(?,?,?,?)'); 
$pattern = '/(?<=^mydb\().+(?=\)\.$)/'; 
$fp = 'dummy'; 
while (false!==($row=dummy_fgets($fp))) { 
    if (preg_match($pattern, $row, $m)) { 
    $row = str_getcsv($m[0], ',', "'"); 
    $stmt->execute($row); 
    echo $row[0], ' -> ', $stmt->rowCount(), "\n"; 
    } 
} 

function dummy_fgets($dummy) { 
    static $data = array(
    "mydb('Test1','log1','Pass','lo1.txt').\n", 
    "mydb('Test2','log2','Pass','lo2.txt').\n", 
    "mydb('Test3','log3','Pass','lo3.txt').\n", 
    // start again ...like you process the same file again + 1 new record 
    "mydb('Test1','log1','Pass','lo1.txt').\n", 
    "mydb('Test2','log2','Pass','lo2.txt').\n", 
    "mydb('Test3','log3','Pass','lo3.txt').\n", 
    "mydb('Test4','log3','Pass','lo3.txt').\n" 
); 
    $rv = current($data); 
    next($data); 
    return $rv; 
} 

impressions

Test1 -> 1 
Test2 -> 1 
Test3 -> 1 
Test1 -> 0 
Test2 -> 0 
Test3 -> 0 
Test4 -> 1