lecture plusieurs fichier txt dans un tableau

Eléphanteau du PHP | 13 Messages

12 mars 2013, 12:34

Bonjour,

Voilà j'ai 5 fichiers txt dans un dossier, chaque fichier txt contient 4 lignes et chaque ligne correspond à un champs... Je dois afficher un tableau avec sur chaque ligne, un fichier txt
il faut savoir que les 4 lignes de chaque fichier txt sont de même type: ligne1=Nom, ligne2=etat, ligne3=retour, ligne4=commentaire

je suis obligé de travailler sans Base de données et je ne peux pas utiliser un seul fichier txt

merci d'avance pour vos éclairages

Eléphanteau du PHP | 20 Messages

12 mars 2013, 12:55

Bonjour,

tu n'as pas de question très précises...

je pense que pour pallier la non utilisation d'une BDD tu peux charger tes fichiers dans un tableau, et travailler dessus.

les modifications seront alors à écrire dans les fichiers existants, en les écrasant pour te simplifier la vie. (au lieu de modifier "un champ" dans un fichier, tu le ré écris en entier (le fichier).

en espérant que cela t'aide.

A+
Quelques pages sur le php et mysql => http://blueguitarmaxime.blogspot.fr/

Eléphanteau du PHP | 13 Messages

12 mars 2013, 13:30

Merci pour ta réponse

J'ai oublié de poser ma question en fait...je sais pas comment lire et afficher les données des 5 fichiers txt dans un seul tableau

ViPHP
xTG
ViPHP | 7331 Messages

12 mars 2013, 14:26

Soit 5 array représentant le contenu des 5 fichiers par ligne :
for($i=0; $i<$max; $i++){
  echo '<tr>';
  echo '<td>';
  if( isSet($array1[$i]) )echo $array1[$i];
  echo '</td>';
  echo '<td>';
  if( isSet($array2[$i]) )echo $array2[$i];
  echo '</td>';
  echo '<td>';
  if( isSet($array3[$i]) )echo $array3[$i];
  echo '</td>';
  echo '<td>';
  if( isSet($array4[$i]) )echo $array4[$i];
  echo '</td>';
  echo '<td>';
  if( isSet($array5[$i]) )echo $array5[$i];
  echo '</td>';
  echo '</tr>';
}
Concernant la récupération du contenu des fichiers tu as nombre de techniques pour faire cela.

Eléphanteau du PHP | 13 Messages

12 mars 2013, 15:41

ok merci, j'arrive à ceci est ce que ça semble juste

<?php

$dirname = "data/";
$dir = opendir($dirname);

while($file = readdir($dir))
{

$file = $dirname.$file;

if(is_file($file))
{
$ouvre=fopen($file,"r"); // ouverture du fichier
while (!feof ($ouvre)) // tant que pas en fin de fichier
{
$lecture = fgets($ouvre, 4096); // stockage dans $lecture
$donnee=explode(";",$lecture); // parsing des données basé sur ";")
$combien=count($donnee)-1; // nbre d'éléments séparés par ";"

//affichage donnée dans tableau

for($i=0; $i<$max; $i++){
echo '<tr>';
echo '<td>';
if( isSet($array1[$i]) )echo $array1[$i];
echo '</td>';
echo '<td>';
if( isSet($array2[$i]) )echo $array2[$i];
echo '</td>';
echo '<td>';
if( isSet($array3[$i]) )echo $array3[$i];
echo '</td>';
echo '<td>';
if( isSet($array4[$i]) )echo $array4[$i];
echo '</td>';
echo '<td>';
if( isSet($array5[$i]) )echo $array5[$i];
echo '</td>';
echo '</tr>';
}
closedir($dir);
?>

merci d'avance

ViPHP
xTG
ViPHP | 7331 Messages

12 mars 2013, 16:27

Test fichiers ce sont des fichiers csv ?

Et sinon... Comprends-tu ce que tu codes ? Cela m'a plutôt l'air d'un copier/coller d'un code trouvé sur le net dans la façon dont tu imbriques tout ça.
Pourquoi je doute ? Car ton code n'a aucun sens... :|

Eléphanteau du PHP | 13 Messages

12 mars 2013, 16:34

J'avoue que je suis complètement perdu, ça fait 5 ans que j'ai plus fait de PHP, et j'essaye de récupérer et comprendre des infos...

J'ai réussi à adapter un code retrouvé dans mes archives qui fait ce que j'ai besoin mais le soucis, c'est quand 2 utilisateurs se connectent en même temps sur mon fichier texte, les informations ne se mettent pas à jour d'où l'idée de partir sur un fichier txt par utilisateur chacun travaillant dans son propre fichier

voilà le code qui fonctionne
[php]<?php


if (get_magic_quotes_gpc()) {
  function stripslashes_deep($value) {
    $value = is_array($value) ? array_map('stripslashes_deep', $value) : (isset($value) ? stripslashes($value) : null);
    return $value;
  }

  $_POST = stripslashes_deep($_POST);
  $_GET = stripslashes_deep($_GET);
  //$_COOKIE = stripslashes_deep($_COOKIE);
}

$structure_tmp = file($structure_file);
$structure = array();
foreach($structure_tmp as $key=>$tmp) {
  /*if(strpos($tmp,':') === 0) {
    $code = explode(':',$tmp);
    ${$code[1]} = trim($code[2]);
    continue;
  }*/
  $line = explode(',',$tmp);
  $name_will_be = str_replace(' ','',trim($line[0]));
  foreach($structure as $key1=>$value1) {
    if ($value1['name'] == $name_will_be)
      die("Few columns have the similar name (not counting spaces): '{$line[0]}'. Please rename.");
  }
  $structure[$key]['name_original'] = trim($line[0]);
  $structure[$key]['name'] = str_replace(' ','',$structure[$key]['name_original']);
  $structure[$key]['type'] = trim($line[1]);
  if (isset($line[2])) $structure[$key]['format'] = trim($line[2]);
  if (isset($line[3])) {
    $values = explode(':',$line[3]);
    foreach($values as $item) {
      $structure[$key]['values'][] = trim($item);
    }
  }
}



// Save data (Submit button pressed)
if (isset($_POST['submit'])) {
  /////////////////////////////////////////////////

  if ($skip_lines > 0) {
    // read header lines
    $tmp_data = file($data_file);
  }

  $f = fopen($data_file,'w+');
  if ($f) {

    // save header back to file
    if ($skip_lines > 0) {
      for($i=0; $i < $skip_lines; $i++) {
        fputs($f,$tmp_data[$i]);
      }
    }

    for( $i=0; $i < count($_POST[$structure[0]['name']]); $i++ ) {
      // do not save records marked for delete
      if (isset($_POST['d_e_l_e_t_e'][$i])) continue;

      $s = '';
      $isfirst = true;
      foreach($structure as $key => $field) {
        $n1 = isset($_POST[$structure[$key]['name']]) ? $_POST[$structure[$key]['name']] : '';
        $v1 = isset($n1[$i]) ? $n1[$i] : $structure[$key]['values'][1];
        // remove new line characters as each new line represents new database row
        $v1 = str_replace(array("\r\n","\n","\r"),'',$v1);
        $s = $s . ($isfirst ? '' : $delimiter) . $v1;
        $isfirst = false;
      }
      // do not save empty lines
      if (trim(str_replace($delimiter,'',$s)) == '') continue;

      // save database record to file
      fputs($f,$s."\n");
    } // for
    fclose($f);
  } // if
}
$f = fopen($data_file,'r'); //ouvre le fichier txt en lecture

//récupération des données
$data = file($data_file);

// skip header lines
if ($skip_lines > 0) $data = array_slice($data, $skip_lines);

// add "new line" holder
$data[] = str_repeat($delimiter,count($structure)-1);

fclose($f); //fermeture du fichier texte

//affichage des données

echo '<html>';
echo "<head><title>Modifier Disponibilité des dépanneurs</title></head>";
echo "<body><font face=arial color=blue ><h1><center>Disponibilité des dépanneurs</center></h1></Font><BR><BR>";
echo '<form method="post">';
echo '<table>'."\n";

// output header
echo '<tr style="background: #AAAAAA; border: 1px solid blue">';
foreach ($structure as $key=>$line) {
  echo "<th>{$line['name_original']}</th>";
}
echo '<th>Sélection</th>';
echo '</tr>'."\n";

// output data
foreach($data as $datakey => $line) {

  // skip empty rows
  if (trim($line) == '') continue;

  echo '<tr style="background: #'.($datakey % 2 == 0 ? 'F0F0F0' : 'FAFAFA').'">';

  $items = explode($delimiter,$line);

  // any fields not defined? add empty
  while (count($items) < count($structure))
    $items[] = '';

  foreach ($items as $key => $item) {
    $item = htmlspecialchars(trim($item));
    $name = $structure[$key]['name'];
    echo "\n".'  <td valign="top">';
    switch ($structure[$key]['type']) {
      case 'STRING':
        echo '<input onchange="cdf('.$datakey.')" name="'.$name.'['.$datakey.']" value="'.$item.'" size="'.$structure[$key]['format'].'" />';
        break;
      case 'TEXT':
        $rc = explode(':',$structure[$key]['format']);
        $cols = trim($rc[0]);
        $rows = trim($rc[1]);
        echo '<textarea onchange="cdf('.$datakey.')" name="'.$name.'['.$datakey.']" rows="'.$rows.'" cols="'.$cols.'">'.$item.'</textarea>';
        break;
      case 'LOGICAL':
        $val_yes = trim($structure[$key]['values'][0]);
        echo '<input onchange="cdf('.$datakey.')" name="'.$name.'['.$datakey.']" type="checkbox" '.(($item == $val_yes) ? 'checked' : '').' value="'.$val_yes.'" />';
        break;
      case 'LIST':
        echo '<select onchange="cdf('.$datakey.')" name="'.$name.'['.$datakey.']" size="'.$structure[$key]['format'].'">';
        foreach($structure[$key]['values'] as $value) {
          echo '<option value="'.$value.'" '.($value == $item ? 'selected' : '').'>'.$value.'</option>';
        }
        echo '</select>';
        break;
    }
    echo '</td>';
  }

  // Mark for delete if last record (i.e. Add option). In this way we'll skip adding empty records
  echo "\n  <td><input id='d_e_l_e_t_e[{$datakey}]'  name='d_e_l_e_t_e[{$datakey}]' type='checkbox' ".($datakey == count($data)-1 ? 'checked' : '')." /></td>";
  echo "\n</tr>\n";

}

echo '<tr><td colspan=255 align=center><input type="submit" name="submit" value="Enregistrer les modifications - Effacer les sélections" style="border:1px solid red"></td></tr>';
echo '</table>';
echo "</form>

<script>
function cdf(theid) {
document.getElementById('d_e_l_e_t_e['+theid+']').checked = false;
}
</script>";

echo '</body>';
echo '</html>';


echo "<BR><BR><body><font face=arial color=blue size= 2> Attention ! Quand une case de la colonne <i><b>Sélection </i></b>est cochée, <BR>";
echo "la ligne entière sera effacée en cliquant sur le bouton <I> <b>Enregister les modifications ... </i></b>! <BR>";
echo "La dernière case reste toujours cochée. </font>";


?>
[/php]

merci d'avance

ViPHP
xTG
ViPHP | 7331 Messages

12 mars 2013, 16:42

Cela dépend de tes besoins. Et visiblement ils sont pas clairement définis (tout du moins pour nous, donc va falloir expliquer).
Si le fichier est une ressource critique il ne doit être ouvert que par une seule personne à la fois.

La solution la plus simple reste de dire : une seule personne travaille sur le fichier à un instant T.
Tu peux donc mettre un verrou pour interdire une seconde ouverture : un fichier créé indiquant que ton fichier est actuellement utilisé. Avec la date de création de ce fichier tu peux gérer la notion de timeout.

Eléphanteau du PHP | 13 Messages

12 mars 2013, 16:50

j'avais pensé à l'histoire de verrou mais le soucis, c'est que plusieurs utilisateurs doivent se connecter et ça doit être rapide( quelques secondes), pas le temps d'attendre...même si la plupart du temps se sera un seul à la fois

ça doit être simple et efficace...le dernier compte répondait au besoin sauf dans le cas de 2 utilisateurs simultanés d'où l'idée de chacun son fichier texte...

j'espère avoir été plus clair

ViPHP
xTG
ViPHP | 7331 Messages

12 mars 2013, 17:43

Quelle est la finalité aussi ?
Car avec ton système là tu vas avoir x fichiers différents du fichier initial.
Et après tu en fais quoi de ces fichiers ? Car un merge c'est pas aussi simple qu'un claquement de doigt à exécuter.

Eléphanteau du PHP | 13 Messages

12 mars 2013, 17:49

simplement afficher un tableau sur une page web de ses données tableau qui sera modifié en continu

voilà le tableau tel qu'il marche actuellement à partir d'un seul fichier texte
http://www.meolice.be/flat/depan.php

parfois un dessin vaut mieux qu'un long discours

ViPHP
xTG
ViPHP | 7331 Messages

12 mars 2013, 18:14

Donc tu as bien une nécessité de merge si le tableau est unique.
Je n'ai pas accès à ton ndm depuis le boulot à cause des restrictions du proxy donc je ne me rends pas compte du type de données qu'il contient.
Mais à mon avis c'est pas un problème simple à résoudre.

Ce que tu veux c'est du travail collaboratif à la google docs par exemple.
Cela ne se fait pas en 3 lignes de code, il y a tout une usine derrière. :|

Au plus simple (mais encore ça mérite de sacré guillemets...) tu peux gérer un verrou par case de ton tableau.
Ainsi à un instant t seul une personne peut modifier une case (tu as donc de l'édition parallèle sur différentes cases).
Et à un instant t une seule écriture dans le fichier (les autres ayant validé en même temps devant attendre la fin de l'écriture pour propager la leur), donc un verrou fichier.

Eléphanteau du PHP | 13 Messages

15 mars 2013, 13:52

J'ai réussit à contourner le problème en mettant les données dans un tableau, chaque ligne du tableau étant l'ouverture d'un fichier texte:
	<?php $data1= file("data1.txt"); ?>
					
					  <td><?php	echo $data1[0]; ?></td>
					  <td><?php	echo $data1[1]; ?></td>
					  <td><?php	echo $data1[2]; ?></td>
					  <td><?php	echo $data1[3]; ?></td>
                        </tr>
                        <tr>
						  
						<?php $data2= file("data2.txt"); ?>
					
					  <td><?php	echo $data2[0]; ?></td>
					  <td><?php	echo $data2[1]; ?></td>
					  <td><?php	echo $data2[2]; ?></td>
					  <td><?php	echo $data2[3]; ?></td>
                        </tr>
                        <tr>
						  
						<?php $data3= file("data3.txt"); ?>
					
					  <td><?php	echo $data3[0]; ?></td>
					  <td><?php	echo $data3[1]; ?></td>
					  <td><?php	echo $data3[2]; ?></td>
					  <td><?php	echo $data3[3]; ?></td>
                        </tr>
                        <tr>
						  
						<?php $data4= file("data4.txt"); ?>
					
					  <td><?php	echo $data4[0]; ?></td>
					  <td><?php	echo $data4[1]; ?></td>
					  <td><?php	echo $data4[2]; ?></td>
					  <td><?php	echo $data4[3]; ?></td>
                        </tr>
                         <tr>
						  
						<?php $data5= file("data5.txt"); ?>
					
					  <td><?php	echo $data5[0]; ?></td>
					  <td><?php	echo $data5[1]; ?></td>
					  <td><?php	echo $data5[2]; ?></td>
					  <td><?php	echo $data5[3]; ?></td>
                        </tr>
						
merci de l'aide apportée...

Je sais qu'il y a surement plus beau comme code mais ça marche ;-)