web-dev-qa-db-fra.com

PHP - analyser un fichier txt

J'ai un fichier .txt qui contient les détails suivants:

ID^NAME^DESCRIPTION^IMAGES
123^test^Some text goes here^image_1.jpg,image_2.jpg
133^hello^some other test^image_3456.jpg,image_89.jpg

Ce que j'aimerais faire, c'est analyser cette annonce pour obtenir les valeurs dans un format plus lisible, éventuellement dans un tableau si possible.

Merci

33
terrid25

Vous pouvez le faire facilement de cette façon

$txt_file    = file_get_contents('path/to/file.txt');
$rows        = explode("\n", $txt_file);
array_shift($rows);

foreach($rows as $row => $data)
{
    //get row data
    $row_data = explode('^', $data);

    $info[$row]['id']           = $row_data[0];
    $info[$row]['name']         = $row_data[1];
    $info[$row]['description']  = $row_data[2];
    $info[$row]['images']       = $row_data[3];

    //display data
    echo 'Row ' . $row . ' ID: ' . $info[$row]['id'] . '<br />';
    echo 'Row ' . $row . ' NAME: ' . $info[$row]['name'] . '<br />';
    echo 'Row ' . $row . ' DESCRIPTION: ' . $info[$row]['description'] . '<br />';
    echo 'Row ' . $row . ' IMAGES:<br />';

    //display images
    $row_images = explode(',', $info[$row]['images']);

    foreach($row_images as $row_image)
    {
        echo ' - ' . $row_image . '<br />';
    }

    echo '<br />';
}

Vous ouvrez d'abord le fichier texte à l'aide de la fonction file_get_contents(), puis vous coupez la chaîne des caractères de nouvelle ligne à l'aide de la fonction explode(). De cette façon, vous obtiendrez un tableau avec toutes les lignes séparées. Ensuite, avec la fonction array_shift(), vous pouvez supprimer la première ligne, car il s'agit de l'en-tête.

Après avoir obtenu les lignes, vous pouvez parcourir le tableau et placer toutes les informations dans un nouveau tableau appelé $info. Vous pourrez alors obtenir des informations par ligne, à partir de la ligne zéro. Ainsi, par exemple, $info[0]['description'] Serait Some text goes here.

Si vous souhaitez également placer les images dans un tableau, vous pouvez également utiliser explode(). Utilisez simplement ceci pour la première ligne: $first_row_images = explode(',', $info[0]['images']);

57
Michiel Pater

Utilisez explode() ou fgetcsv() :

$values = explode('^', $string);

Ou, si vous voulez quelque chose de plus agréable:

$data = array();
$firstLine = true;
foreach(explode("\n", $string) as $line) {
    if($firstLine) { $firstLine = false; continue; } // skip first line
    $row = explode('^', $line);
    $data[] = array(
        'id' => (int)$row[0],
        'name' => $row[1],
        'description' => $row[2],
        'images' => explode(',', $row[3])
    );
}
8
ThiefMaster

L'exemple de loin le meilleur et le plus simple que j'ai rencontré est tout simplement la méthode file ().

$array = file("myfile");
foreach($array as $line)
       {
           echo $line;
       }

Cela affichera toutes les lignes du fichier, cela s'applique également à une URL distante.

Simple et clair.

REF: IBM PHP Parse

6
Pogrindis

Je voudrais contribuer un fichier qui fournit des structures de données atomiques.

$lines = file('some.txt');
$keys = explode('^', array_shift($lines));
$results = array_map(
    function($x) use ($keys){
        return array_combine($keys, explode('^', trim($x)));
    }, 
    $lines
);
4
Lloyd Moore

Essayez fgetcsv() avec ^ comme séparateur:

$file = fopen($txt_file,"r");
print_r(fgetcsv($file, '^'));
fclose($file);

http://www.w3schools.com/php/func_filesystem_fgetcsv.asp

3
adarshr
<?php
$row = 1;
if (($handle = fopen("test.txt", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, "^")) !== FALSE) {
        $num = count($data);
        echo "<p> $num fields in line $row: <br /></p>\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        }
    }
    fclose($handle);
}
?>
0
tawfekov

Ok, je n'ai pas vu la version éditée, alors voici un refaire. C'est très probablement un fichier CSV qui utilise des carets comme séparateur, donc ...

$fh = fopen('yourfile.txt');
$headers = fgetcsv($fh, 0, '^');
$details = array();
while($line = fgetcsv($fh, 0, '^')) {
   $details[] = $line;
}
fclose($fh);
0
Marc B

youse une liste, et divisez le "image_1.jpg, image_2.jpg" après avoir explosé la chaîne:

list($number, $status, $text, $images) = explode("^", $data);

$splited_images= preg_split(',', $images);
0
jwillmer

Ma solution

function parseTextFile($file){
    if( !$file = file_get_contents($file))
        throw new Exception('No file was found!!');
    $data = [];
    $firstLine = true;
    foreach(explode("\n", $file) as $line) {
        if($firstLine) { 
            $keys=explode('^', $line);
            $firstLine = false; 
            continue; 
        } // skip first line
        $texts = explode('^', $line);
        $data[] = array_combine($keys,$texts);
    }
    return $data;
}
0
Marcos