2009-08-16 2 views
0

Мой клиент периодически получает набор текстовых файлов CSV, где элементы в каждой строке соответствуют последовательному порядку и формату, но запятые, которые их разделяют, несовместимы. Иногда один запятая отделить два элемента и другие времена, это будет два или четыре запятые, и т.д ...PHP: форматирование нерегулярных CSV-файлов в таблицы HTML

РНР приложение Я пишу попытки сделать следующие вещи:

PSEUDO-CODE: 
1. Upload csv.txt file from client's local directory. 
2. Create new HTML table. 
3. Insert the first three fields FROM csv.txt into HTML table row. 
4. Iterate STEP 2 while the FIRST field equals the First field below it. 
5. If they do not equal, CLOSE HTML table. 
6. Check to see if FIRST field is NOT NULL, IF TRUE, GOTO step 2, Else close HTML table. 

я не имею никаких проблем с шагами 1 и 2. Шаг 3 - это то, где он становится сложным, поскольку поля в файлах csv.txt не всегда разделяются одним и тем же числом запятых. Однако они всегда находятся в одном и том же относительном порядке и формате. У меня также проблемы с шагом 4. Я не знаю, как проверить, совпадает ли начальное поле в строке с начальным полем в строке ниже. Шаги 5 должны быть относительно простыми. Для шага 6 мне нужно найти эквивалент функции «GOTO» в PHP.

Пожалуйста, дайте мне знать, если какая-либо часть вопроса неясна. Я ценю вашу помощь.

Спасибо заранее!

ответ

1

Если вы хотите, чтобы сгруппировать строки по их первому элементу, вы можете попробовать что-то вроде:

  • прочитать следующую строку с помощью fgetcsv()
  • фильтра пустых элементов (а ,, Ь, с - > а, б, в)
  • , если строка содержит поля < - > не пустой добавьте строку «его» группа

это не совсем то, что вам «Ве описано, но это может быть то, что вы хотите ;-)

<?php 
$fp = fopen('test.csv', 'rb') or die('!fopen'); 
$groups = array(); 
while(!feof($fp)) { 
    $row = array_filter(fgetcsv($fp)); 
    if (!empty($row)) { 
    // @ because I don't care whether the array exists or not 
    @$groups[$row[0]][] = $row; 
    } 
} 

foreach($groups as $g) { 
    echo ' 
    <table>'; 
    foreach($g as $row) { 
    echo ' 
     <tr> 
     <td>', join('</td><td>', array_map('htmlentities', $row)), '</td> 
     </tr> 
    '; 
    } 
    echo '</table>'; 
} 
1

Почему бы просто не начать с замены любых кратных запятых с помощью одной запятой. например:

азбука, Защита ,, ГХИ ,,,, JKL

становится:

азбуки, Защита, ГХИ, JKL

, а затем просто продолжать нормально.

+0

что или Regex. о GoTo, я уверен, что вам не нужен goto .. разве это не в цикле? –

+0

Точно ... Если у вас сломанные данные, вы должны исправить это, прежде чем работать с ним, а не пытаться работать со сломанными данными. – Greg

1

Если вы имеете в виду, что на каждой строке есть разные числа запятых, то насколько я вижу, на самом деле невозможно сделать то, что вы хотите сделать, взглянув только на запятые. Например:

ab,c,d,ef // could group columns a-f in that way, but 
a,bc,de,f // could also group columns a-f 

... и вы не имели бы никакого способа знать, что было правильное расположение, если вы не даны другие указания или тип данных, можно идентифицировать с помощью регулярного выражения, как кто-то сказал.

Если с другой стороны, вы просто означает, что иногда есть пробелы, но есть еще такое же количество столбцов, например:

a,b,,d,e,f 
a,,c,d,e,f 

... тогда вы можете сформировать таблицу правильно. Я бы рекомендовал использовать explode (',' $ line) в этом случае, а затем выполнить обработку элементов в разобранном массиве, не беспокоясь о том, что внутри них.

Смежные вопросы