valores - PHP-analizando un archivo txt
leer y mostrar archivo de texto en php (9)
Me gustaría contribuir con un archivo que proporcione 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
);
Tengo un archivo .txt que tiene los siguientes detalles:
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 este anuncio, obtener los valores en un formato más legible, posiblemente en una matriz si es posible.
Gracias
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;
}
Ok, no vi la versión editada, así que aquí está un rehacer. Es muy probable que sea un archivo CSV que usa carets como separador, así que ...
$fh = fopen(''yourfile.txt'');
$headers = fgetcsv($fh, 0, ''^'');
$details = array();
while($line = fgetcsv($fh, 0, ''^'')) {
$details[] = $line;
}
fclose($fh);
Por 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 para una URL remota.
Sencillo y claro.
REF: IBM PHP Parse
Pruebe fgetcsv()
con ^
como el carácter separador:
$file = fopen($txt_file,"r");
print_r(fgetcsv($file, ''^''));
fclose($file);
Utilice explode()
o fgetcsv()
:
$values = explode(''^'', $string);
O, si quieres algo más bonito:
$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])
);
}
Utilice una lista y divida "image_1.jpg, image_2.jpg" después de explotar la cadena:
list($number, $status, $text, $images) = explode("^", $data);
$splited_images= preg_split('','', $images);
Puedes 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 abra el archivo de texto con la función file_get_contents()
y luego corte la cadena en los caracteres de nueva línea usando la función explode()
. De esta manera 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 colocar toda la información en una nueva matriz llamada $info
. Entonces podrá obtener información por fila, comenzando en la fila cero. Entonces, por ejemplo, $info[0][''description'']
sería Some text goes here
.
Si también desea colocar las imágenes en una matriz, también puede usar explode()
. Solo use esto para la primera fila: $first_row_images = explode('','', $info[0][''images'']);
<?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);
}
?>