PHP цикл по CSV - начало и конец цикла в шаблоне Regex - PullRequest
0 голосов
/ 11 августа 2011

Мне нужно распечатать CSV-файл в HTML или поместить числовые данные в базу данных:
Но мне нужно запустить цикл в определенной позиции и разорвать его в другой конкретной позиции (регулярное выражение).
Так что мне нужноперепечатывать только строки с числовыми данными и все столбцы из них.
Ниже приведен псевдокод - не работает должным образом:

<?php
$row = 1;
$handle = fopen("test.csv", "r");
while ($data = fgetcsv($handle, 1000, ","))
{
   if (preg_match('/[Morning]/', $data[0]) === 1 // start at this rwo plus two lines down )
    {
    $num = count($data);
    $row++;
      for ($c=0; $c < $num; $c++)
      {
            for ($c=0; $c < $num; $c++)
            {  
              echo $data[$c] . " ";
            }   
      if (preg_match('/[Total Cash:]/', $data[0]) === 1)
        { break; row -1 }            
      }
       echo "<br>";  
   }
}
fclose($handle); ?>

Итак, CSV выглядит так:

/<em>--some lines--</em>/</p>

<p>Date: 3/3/11,
Morning,
--blank line---
Customer No,Time,CheckNo,Total,
1234,12-45,01,20.00,
1236,1-00,03,30.00,
1240,2-00,06,30.00,
--more numerical rows of data at variable length that I need to loop over--
1500,4-00,07,22.00, 
----,----,---,----,
Total Cash, , , ,120.00,</p>

<p>/<em>--some other lines--and it goes</em>/</p>

<p>Lunch Time,
---similar like Morning above ---

Любая информация, как правильно решить эту проблему, ценится, теперь я могу сделать так много циклов и регулярных выражений, но с этим мне нужно больше времени и помощи.Благодаря.

Ответы [ 3 ]

0 голосов
/ 11 августа 2011
$lines = file('test.csv');
$parsing = false;
foreach ($lines as $line)
{
    $parsing = ((strpos($line, 'Morning') !== false) || $parsing)
        && ((strpos($line, 'Total Cash') === false);

    if (!$parsing)
        continue;

    $values = strgetcsv($line);
    echo implode(' ', $values);
}

Редактировать: в основном, это то же самое, что решение Дана Гроссманса, но короче; -)

0 голосов
/ 11 августа 2011
$lines = file('test.csv');

// Skip the unwanted lines
// Means: Every line until the line containing "Morning,"
do {
    $line = array_shift($lines);
} while(trim($line) !== 'Morning,');
$lines = array_slice($lines, 2); // Mentioned something about "2 lines below" or such" ^^

// Do something with the remaining lines, until
// Line _begins_ with "Total Cash"
while(strncmp('Total Cash', trim($line = array_shift($lines)), 10) !== 0) {
    echo implode(' ', str_getcsv($line)) . PHP_EOL;
}
0 голосов
/ 11 августа 2011
$lines = file('test.csv'); //read file into an array, one entry per line

$active = false; //keep track of what rows to parse

//loop one line at a time
for ($i = 0; $i < count($lines); $i++) {
  $line = $lines[$i];

  if (strpos($line, 'Morning') !== false) { //start parsing on the next row
    $active = true;
    $i += 2; //skip the blank line and header
    continue;
  }
  if (strpos($line, '----,') !== false) { //stop parsing rows
    $active = false;
  }

  if ($active) { //if parsing enabled, split the line on commas and do something with the values
    $values = str_getcsv(trim($line));
    foreach ($values as $value) {
      echo $value . " "; //these are the numbers
    }
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...