2011-03-14 14 views
29

Ho un file txt che ha i seguenti dati:PHP - l'analisi di un file txt

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 

Quello che mi piacerebbe fare, è analizzare questo annuncio ottenere i valori in un formato più leggibile, possibilmente in un array, se possibile.

Grazie

risposta

55

che si può fare facilmente questo modo

$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 />'; 
}

Per prima cosa aprire il file di testo utilizzando la funzione di file_get_contents() e poi si taglia la stringa sui caratteri di nuova riga utilizzando la funzione explode(). In questo modo otterrai un array con tutte le righe separate. Quindi con la funzione array_shift() è possibile rimuovere la prima riga, in quanto è l'intestazione.

Dopo aver ottenuto le righe, è possibile scorrere l'array e inserire tutte le informazioni in un nuovo array denominato $info. Sarai quindi in grado di ottenere informazioni per riga, a partire dalla riga zero. Ad esempio, ad esempio $info[0]['description'] sarebbe Some text goes here.

Se si desidera inserire anche le immagini in un array, è possibile utilizzare anche explode(). Basta usare questo per la prima fila: $first_row_images = explode(',', $info[0]['images']);

+0

@Michiel Pater grazie per il headsup, il problema è che quando ricevo le immagini, var_dump() appena uscite: IMMAGINI 123IMAGES 123IMAGES 123IMAGES 123IMAGES 123IMAGES 123IMAGES 123 tutte le idee? – terrid25

+0

@ terrid25: Hai provato il mio nuovo codice (aggiornato)? Se sì, per favore pubblica il codice che stai usando per 'var_dump()'. –

+0

@ terrid25: Sto usando il seguente codice: 'var_export (explode (',', $ info [1] ['images']));'. Emette: 'array (0 => 'image_1.jpg', 1 => 'image_2.jpg',)'. –

8

Usa explode() o fgetcsv():

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

Oppure, se volete qualcosa di più bello:

$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]) 
    ); 
} 
+0

come posso quindi accedere ai valori? – terrid25

+0

Impara PHP. 'foreach ($ data as $ row)' e quindi ad es. '$ row ['id']' – ThiefMaster

0
<?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

Come dividerei le immagini? – terrid25

0

Ok, non ha visto la versione modificata, quindi ecco una ripetizione. E 'più probabile un file CSV che utilizza CARETS come separatore, quindi ...

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

Youse una lista, e dividi "image_1.jpg, image_2.jpg" dopo aver esploso la stringa:

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

$splited_images= preg_split(',', $images); 
4

Di gran lunga l'esempio migliore e più semplice di ciò che ho trovato è semplicemente il metodo file().

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

Questo visualizzerà tutte le righe nel file, questo è applicabile anche per un URL remoto.

Semplice e chiaro.

REF: IBM PHP Parse

3

vorrei contribuire con un file che fornisce strutture di dati atomiche.

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

Bello! Questo è anche più completo degli altri metodi in quanto effettivamente * usa * la riga dell'intestazione. – demonkoryu

0

La mia soluzione

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; 
} 
Problemi correlati