PHP - разбор текстового файла

У меня есть .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

Что бы я хотел сделать, проанализируйте это объявление, чтобы получить значения в более читаемом формате, возможно, в массив, если это возможно.

Спасибо

Ответ 1

Вы можете сделать это легко таким образом

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

Сначала вы открываете текстовый файл с помощью функции file_get_contents(), а затем вырезаете строку на символах новой строки, используя функцию explode(). Таким образом вы получите массив со всеми рядами. Затем с помощью функции array_shift() вы можете удалить первую строку, так как она является заголовком.

После получения строк вы можете перебирать массив и помещать всю информацию в новый массив с именем $info. Затем вы сможете получать информацию в строке, начиная с нулевой строки. Например, $info[0]['description'] будет Some text goes here.

Если вы хотите поместить изображения в массив, вы также можете использовать explode(). Просто используйте это для первой строки: $first_row_images = explode(',', $info[0]['images']);

Ответ 2

Используйте explode() или fgetcsv():

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

Или, если вам нужно что-то приятнее:

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

Ответ 3

На сегодняшний день лучшим и простейшим примером этого я пришел, это просто метод file().

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

Это отобразит все строки в файле, это также применимо для удаленного URL.

Простой и понятный.

REF: IBM PHP Parse

Ответ 4

Я хотел бы внести файл, который предоставляет атомные структуры данных.

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

Ответ 6

<?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);
}
?>

Ответ 7

Хорошо, не видел отредактированную версию, так что вот повтор. Это, скорее всего, файл CSV, который использует каретки в качестве разделителя, поэтому...

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

Ответ 8

введите список и разделите "image_1.jpg, image_2.jpg" после того, как вы взорвете строку:

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

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

Ответ 9

Мое решение

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