2013-06-03 4 views
2

У меня есть CSV файл, как следующее (он имеет прибл 500 строк)Разбор CSV - случайный выход

ID,Title,LastName,HouseNo,Street,City,Postcode,Telephone 
1209109,Miss,Test,1635,Test Road,Test, AB12 2EF, 
1209833,Mrs,Test,3,Test Close,Test,BB12 2EF, 
1205839,Miss,Test,1,Test Road,Test,AA12 2EX, 

Я тогда с помощью следующего PHP:

$handle = fopen($csvFile, "r"); 
$imports = array(); 

$row = 1; 
echo "<table>"; 
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
{ 
     // skip headers 
     if($row == 1){ $row++; continue; } 
     echo "<tr>"; 
     echo "<td>$data[0]</td>"; 
     echo "<td>$data[1]</td>"; 
     echo "<tr>"; 

} 
echo "</table>"; 
fclose($handle);` 

Я ожидал что-то вроде :

1209109 Miss 
1209833 Mrs 

Но по какой-то причине, кажется, начинается в произвольный момент времени в файле, а затем выводить некоторые данные в тыс e неправильный <td>.

Может ли пролема быть конечной запятой на каждой строке?

Благодаря

+0

Я никогда не видел CSV-файл с запятыми в конце каждого lin e, попробовали ли вы их удалить? – meda

+1

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

+2

@meda, я вижу их все время. Когда у кого-то нет данных для последнего столбца, но слишком ленив, чтобы проверить это. Парсер CSV не должен терпеть неудачу. – MarioP

ответ

1

Я предполагаю, что этот вопрос вы испытываете является оконечным резистором (EOL) рассогласования. В принципе, функция fgetcsv() разбивает файл на основе символа новой строки, но ожидает другого символа, чем тот, который использует этот файл (например, \n\r против \r против \n). В результате функция просто захватывает первые символы 1000 (в соответствии с вызовом функции) и рассматривает ее как первую строку, затем захватывает следующий 1000 символов и т. Д. ... это приведет к некоторым случайным выходам.

Вы могли бы попробовать что-то вроде:

ini_set('auto_detect_line_endings', true); 

, прежде чем захватить файл. Или вы можете пройти и вручную изменить CSV, чтобы стандартизировать символы EOL/открыть электронную таблицу в преобразовании файлов, что позволяет вам изменять символ EOL (например, Unix vs Windows

0

Я не смог воспроизвести ваши ошибка с данными, которые вы предоставили (даже если левая запятая оставлена ​​или удалена), но я заметил, что вы не закрываете свою таблицу в коде, который вы поставили.

Я не подумайте, что это повлияет на вашу ошибку отображения, но вы можете изменить свой код:

$row = 1; 
echo "<table>"; 
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
{ 
    // skip headers 
    if($row == 1) { 
    $row++; 
    continue; 
    } 
    echo "<tr>"; 
    echo "<td>$data[0]</td>"; 
    echo "<td>$data[1]</td>"; 
    echo "</tr>\n"; 

} 
echo "</table>"; 
fclose($handle);