Я читаю файл CSV, но некоторые значения не экранированы, поэтому PHP читает его неправильно. Вот пример плохой строки:
« 635 », « », « ОБРИ Р. ФИЛЛИПС (1920–) - пастель с изображением коттеджей в речной долине с крутыми склонами, возможно, в Северном Уэльсе, подпись и дата 2000 г., рама, 66 см на 48 см. еще один сельский пейзаж, озаглавленный оборотная сторона «Время сбора урожая, Сомерсет», подписанное и датированное 87 годом, в рамке, 69 на 49 см. (2) NB — Обри Филлипс — художник из Вустершира, который учился в Школе искусств Стоурбриджа.», «40», «60», «WAT ","Картины, гравюры и акварели",
Вы можете видеть, что Harvest Time, Somerset заключен в кавычки, заставляя PHP думать, что это новое значение.
Когда я делаю print_r() для каждой строки, ломаные строки выглядят так:
Array
(
[0] => 635
[1] =>
[2] => AUBREY R. PHILLIPS (1920- ) - Pastel depicting cottages in a steep sided river valley, possibly North Wales, signed and dated 2000, framed, 66cm by 48cm. another of a rural landscape, titled verso Harvest Time
[3] => Somerset" signed and dated '87
[4] => framed
[5] => 69cm by 49cm. (2) NB - Aubrey Phillips is a Worcestershire artist who studied at the Stourbridge School of Art."
[6] => 40
[7] => 60
[8] => WAT
[9] => Paintings, prints and watercolours
[10] =>
)
Что, очевидно, неверно, так как теперь он содержит гораздо больше элементов массива, чем другие правильные строки.
Вот PHP, который я использую:
$i = 1;
if (($file = fopen($this->request->data['file']['tmp_name'], "r")) !== FALSE) {
while (($row = fgetcsv($file, 0, ',', '"')) !== FALSE) {
if ($i == 1){
$header = $row;
}else{
if (count($header) == count($row)){
$lots[] = array_combine($header, $row);
}else{
$error_rows[] = $row;
}
}
$i++;
}
fclose($file);
}
Строки с неправильным количеством значений помещаются в $error_rows
, а остальные помещаются в большой массив $lots
.
Что я могу сделать, чтобы обойти это? Спасибо.