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 

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

благодаря

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

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

Используйте fgetcsv() или 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]) ); } 

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

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

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

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

REF: IBM PHP Parse

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

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

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

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

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

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

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

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

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

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

Мое решение

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