БлогNot. PHP: прочитать табличные данные из текстового файла

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 [2305 просмотров]


теги: textprocessing учебное список php форматы

показать комментарии (1)