PHP: прочитать табличные данные из текстового файла
Стандартный набросок кода, чтобы не выкидывать...
Ситуация типовая - имеем текстовый файл с записями, состоящими из нескольких столбцов, предполагается, что разделителями между столбцами служат обычные пробелы или табуляции, количество разделителей и "визуальное" выравнивание столбцов при этом неважно.
Разные столбцы имеют разные требования к формату данных (в примере - дата, вещественное число, целое число из 1 цифры), при этом в файле могут быть и ошибочные строки с данными, например:
2018-06-12 10.000 1 2018-06-13 20.00 1 2018-06-13 20.000 1 2018-06-14 60.000 123 2018-06-15 70.000 1
Для показанного здесь файла data.txt
разумным будет вывод вроде этого:
Valid records: 4 from 6 total (2018-06-12, 10.000, 1) in line 1 (2018-06-13, 20.00, 1) in line 2 (2018-06-13, 20.000, 1) in line 3 (2018-06-15, 70.000, 1) in line 6 Bad records: 2 from 6 total Bad column 3 format in line 4 Bad column count =1 in line 5
Ниже приводится сам скрипт, его идея очень проста - имея требуемое количество столбцов $needcolumns
и массив шаблонов столбцов $templates
, читаем данные построчно и проверяем их на соответствие шаблонам.
Каждая строка предварительно фильтруется от лишних разделителей. Выполнялось на Denwer, сработало.
<?php //Настройки: $handle = fopen("data.txt", "rb"); //Файл с данными $needcolumns = 3; //Сколько нужно столбцов $templates = Array ( //Шаблоны $needcolumns столбцов (регулярки для них) '/^\d{4}-\d{2}-\d{2}$/', //Шаблон даты ГГГГ-ММ-ДД '/^\d+\.{0,1}\d{0,3}$/', //Шаблон вещественного числа 123.456 '/^[1-9]{1}$/' //Шаблон флажка 1-9 ); //Код: $count = 1; //Счётчик строк файла $data = array(); //Данные $missedlines = array (); //Список ошибок while (!feof($handle)) { $buffer = fgets($handle); $line = preg_replace('/\s+/',' ',$buffer); //Убрать лишние разделители $line = explode(' ',trim($line)); //Получить массив элементов строки $cnt = count($line); if ($cnt != $needcolumns) $missedlines[] = 'Bad column count ='.$cnt.' in line '.$count; //Не то количество столбцов else { for ($i=0; $i<$cnt; $i++) { //Проверить элементы на соответствие шаблонам if (!preg_match($templates[$i],$line[$i],$check)) { $missedlines[] = 'Bad column '.($i+1).' format in line '.$count; if (isset($data[$count])) unset ($data[$count]); //Убрать строку, если уже занесена break; } $data[$count][$i] = $check[0]; } } $count++; } fclose ($handle); $goodcount = count($data); $missingcount = count ($missedlines); $count = $goodcount + $missingcount; echo '<b>Valid records</b>: ' . $goodcount . ' from ' . $count . ' total<br>'; if ($goodcount) { foreach ($data as $key => $val) { echo '('; for ($j=0; $j<$needcolumns; $j++) echo $val[$j]. ($j<$needcolumns-1 ? ', ' : ''); echo ') in line ' . $key . '<br>'; } } echo '<b>Bad records</b>: ' . $missingcount . ' from ' . $count . ' total<br>'; if ($missingcount) foreach ($missedlines as $val) echo $val . '<br>'; ?>
15.06.2018, 13:57 [2370 просмотров]