2011-03-14 29 views
29

Tengo un archivo .txt que contenga los siguientes datos:PHP - analizar un archivo 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 

Lo que me gustaría hacer, es analizar Artículo Obtener los valores en un formato más legible, posiblemente en una matriz si es posible.

Gracias

Respuesta

55

puede hacerlo fácilmente de esta manera

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

Primero se abre el archivo de texto usando la función file_get_contents() y luego se corta la cadena en los caracteres de nueva línea utilizando la función explode(). De esta forma obtendrá una matriz con todas las filas separadas. Luego, con la función array_shift() puede eliminar la primera fila, ya que es el encabezado.

Después de obtener las filas, puede recorrer la matriz y poner toda la información en una nueva matriz llamada $info. Luego podrá obtener información por fila, comenzando en la fila cero. Entonces, por ejemplo, $info[0]['description'] sería Some text goes here.

Si quiere poner las imágenes en una matriz también, puede usar explode() también. Sólo tiene que utilizar esto para la primera fila: $first_row_images = explode(',', $info[0]['images']);

+0

@Michiel Pater gracias por la headsup, el problema es, cuando llegue a las imágenes, var_dump() simplemente da salida: IMÁGENES 123IMAGES 123IMAGES 123IMAGES 123IMAGES 123IMAGES 123IMAGES 123 alguna idea? – terrid25

+0

@ terrid25: ¿Has probado mi nuevo código (actualizado)? En caso afirmativo, publique el código que está utilizando para 'var_dump()'. –

+0

@ terrid25: Estoy usando el siguiente código: 'var_export (explode (',', $ info [1] ['images']))'. Emite: 'array (0 => 'image_1.jpg', 1 => 'image_2.jpg',)'. –

8

Uso explode() o fgetcsv():

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

O, si quieres algo más agradable:

$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

¿cómo puedo acceder a ellos? – terrid25

+0

Aprender PHP. 'foreach ($ data as $ row)' y luego p. ej. '$ 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

¿Cómo dividiría las imágenes? – terrid25

0

Ok, no vio la versión editada, así que aquí hay un rehacer. Es más probable que un archivo CSV que utiliza signos de intercalación como separador, así que ...

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

Youse una lista, y dividir el "image_1.jpg, image_2.jpg" después de explotar la cadena:

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

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

Con mucho, el mejor y más simple ejemplo de esto que he encontrado es simplemente el método file().

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

Esto mostrará todas las líneas en el archivo, esto también es aplicable a una URL remota.

Simple y claro.

REF: IBM PHP Parse

3

me gustaría contribuir con un archivo que proporciona estructuras de datos atómicos.

$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

¡Hermoso! Esto también es más completo que los otros métodos porque en realidad * usa * la línea del encabezado. – demonkoryu

0

Mi solución

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; 
} 
Cuestiones relacionadas