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

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

Спасибо


person terrid25    schedule 14.03.2011    source источник


Ответы (9)


Это легко сделать.

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

person Michiel Pater    schedule 14.03.2011
comment
@Michiel Pater, спасибо за наводку, проблема в том, что когда я получаю изображения, var_dump() просто выводит: ИЗОБРАЖЕНИЯ 123ИЗОБРАЖЕНИЯ 123ИЗОБРАЖЕНИЯ 123ИЗОБРАЖЕНИЯ 123ИЗОБРАЖЕНИЯ 123ИЗОБРАЖЕНИЯ 123ИЗОБРАЖЕНИЯ 123 есть идеи? - person terrid25; 14.03.2011
comment
@terrid25: Вы пробовали мой новый (обновленный) код? Если да, опубликуйте код, который вы используете для var_dump(). - person Michiel Pater; 14.03.2011
comment
@terrid25: я использую следующий код: var_export(explode(',', $info[1]['images']));. Выводит: array ( 0 => 'image_1.jpg', 1 => 'image_2.jpg', ). - person Michiel Pater; 14.03.2011
comment
Да, я пробовал обновленный код. var_dump($info[1]['images']); дает мне NULL. Мой полный код $txt_file = file_get_contents('test.txt'); $rows = explode("\r\n", $txt_file); foreach($rows as $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]; var_dump($info[1]['images']); } - person terrid25; 14.03.2011
comment
@terrid25: Значит, ты занимаешься чем-то другим. Когда я пытаюсь использовать тот же код, он выводит string(23) "image_1.jpg,image_2.jpg". У вас есть тот же контент в текстовом файле, что и в вашем вопросе? - person Michiel Pater; 14.03.2011
comment
@terrid25: Вы должны поставить var_dump() после }. Кроме того, попробуйте использовать $first_row_images = explode(',', $info[0]['images']);, а затем использовать var_export($first_row_images), чтобы увидеть разделенные изображения. - person Michiel Pater; 14.03.2011
comment
Ага, скопировал и вставил. Мой выход сейчас array ( 0 => 'IMAGES 123', ) - person terrid25; 14.03.2011
comment
@ terrid25: Хорошо, я обновил свой вопрос. Я изменил "\r\n" на "\n". Возможно, это решит вашу проблему. Кроме того, я изменил $first_row_images = explode(',', $info[0]['images']); на $first_row_images = explode(',', $info[1]['images']);, поэтому вместо заголовков вы получите данные. - person Michiel Pater; 14.03.2011
comment
@Michiel Pater хорошо, некоторые улучшения. Проблема в том, что мне нужна вся информация для каждой из строк, кроме значений заголовков. Код, который вы сделали для меня, возвращает только значения первых строк. Спасибо - person terrid25; 14.03.2011
comment
@ terrid25: я снова обновил свой ответ. Теперь он будет напрямую выводить всю информацию о каждой строке. Заголовок удаляется с помощью функции array_shift(). Пожалуйста, дайте мне знать, когда вы добились некоторого прогресса. - person Michiel Pater; 14.03.2011
comment
@terrid25: я немного изменил часть array_shift(). Это работает для меня. - person Michiel Pater; 14.03.2011
comment
@Michiel Pater, могу я спросить, где установлена ​​$info? Спасибо - person terrid25; 17.03.2011
comment
Это не выводит заголовки из строки заголовка. - person Lloyd Moore; 28.01.2016
comment
file_get_contents() и взорваться можно за один раз с файловой функцией: file('path/to/file.txt', FILE_IGNORE_NEW_LINES) Флаг можно снять, если $data обрезается перед использованием (флаг удаляет символ новой строки) - person Bevelopper; 24.03.2021


Безусловно, лучший и простейший пример этого, с которым я столкнулся, — это просто метод file().

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

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

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

Ссылка: IBM PHP Parse

person Pogrindis    schedule 16.05.2013

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

$lines = file('some.txt');
$keys = explode('^', array_shift($lines));
$results = array_map(
    function($x) use ($keys){
        return array_combine($keys, explode('^', trim($x)));
    }, 
    $lines
);
person Lloyd Moore    schedule 26.09.2013
comment
Красивый! Это также более полно, чем другие методы, поскольку фактически использует строку заголовка. - person demonkoryu; 07.01.2014

Попробуйте fgetcsv() с ^ в качестве символа-разделителя:

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

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

person adarshr    schedule 14.03.2011

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

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

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

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

$splited_images= preg_split(',', $images);
person jwillmer    schedule 14.03.2011

Мое решение

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;
}
person Marcos    schedule 22.01.2015

person    schedule
comment
Как бы я разделил изображения? - person terrid25; 14.03.2011