проблема с чтением PHP файлов CSV
Вопрос
Я пытаюсь прочитать данные из файла .csv, чтобы вывести их на веб-страницу в виде текста.
Я впервые делаю это, и у меня возникла небольшая неприятная проблема.
Мой файл .csv (который по умолчанию открывается в Excel) содержит несколько строк, и я читаю все это как одну длинную строку.
вот так:
$contents = file_get_contents("files/data.csv");
В этом примере файла, который я сделал, есть 2 строки.
Paul Blueberryroad 85 фонарик США, сумка 20 ноября, 2008, 16:39
Hellen Blueberryroad 85 us объектив 13мм, фонарик, сумка, ExtraBatteries ноябрь 20, 2008, 16:41:32
Но строка, читаемая PHP, такова:
Пол; Blueberryroad 85; нас; фонарик, сумка; 20 ноября 2008 г., 16:39Hellen; Blueberryroad 85; нас; линзы13mm, фонарик, сумка, ExtraBatteries; 20 ноября 2008 г., 16:41:32
Я делю это на:
list($name[], $street[], $country[], $accessories[], $orderdate[]) = split(";",$contents);
Я хочу, чтобы $ name [] содержало " Paul " и "Hellen" как его содержание. И другие массивы для получения значений их соответствующих столбцов.
Вместо этого я получаю только Пола, а содержимое $ orderdate [] равно
20 ноября 2008 г., 16:39 Хеллен
Таким образом, все строки объединены. Может кто-нибудь показать мне, как я могу достичь того, что мне нужно?
РЕДАКТИРОВАТЬ: решение найдено, осталась только одна странная вещь:
Я решил это сейчас, используя этот фрагмент кода:
$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
$contents[] = fgetcsv($fo,0,';');
}
fclose($fo);
По какой-то причине, хотя мой CSV-файл содержит только 2 строки, он возвращает 2 массива и 1 логическое значение. Первые 2 - это мои массивы данных, а логическое значение равно 0.
Решение
Вам лучше использовать fgetcsv () , который знает о структуре файла CSV и имеет определенные параметры для обработки файлов CSV. Кроме того, вы можете использовать str_getcsv () в содержимом файл вместо этого.
Другие советы
Функция file () считывает файл в массив, каждая строка является записью массив. р>
Так что вы можете сделать что-то вроде:
$rows = array();
$name = array();
$street = array();
$country = array();
$rows = file("file.csv");
foreach($rows as $r) {
$data = explode(";", $r);
$name[] = $data[0];
$street[] = $data[1];
$country[] = $data[2];
}
Я решил это сейчас, используя этот фрагмент кода:
$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
$contents[] = fgetcsv($fo,0,';');
}
fclose($fo);
По какой-то причине, хотя мой CSV-файл содержит только 2 строки, он возвращает 2 массива и 1 логическое значение. Первые 2 - это мои массивы данных, а логическое значение равно 0.
Замечание о fgetcsv правильное.
Я все равно отвечу на ваш вопрос для образовательных целей. Во-первых, я не понимаю разницу между вашими данными (с запятыми) и строкой ", читаемой PHP " (он заменяет некоторые пробелы точкой с запятой, но не все?). PS: я посмотрел исходный код вашего сообщения, он выглядит как странное сочетание TSV (табуляции) и CSV (кома).
Кроме того, если вы хотите пойти по этому пути, вам нужно сначала разбить файл на строки, а затем на строки в полях.
Лучший способ - это, конечно, fgetcsv (), как указано.
$f = fopen ('test.csv', 'r');
while (false !== $data = fgetcsv($f, 0, ';'))
$arr[] = $data;
fclose($f);
Но если у вас есть содержимое в переменной и вы хотите разделить ее, а str_getcsv недоступен, вы можете использовать это:
function str_split_csv($text, $seperator = ';') {
$regex = '#' . preg_quote($seperator) . '|\v#';
preg_match('|^.*$|m', $text, $firstline);
$chunks = substr_count($firstline[0], $seperator) + 1;
$split = array_chunk(preg_split($regex, $text), $chunks);
$c = count($split) - 1;
if (isset($split[$c]) && ((count($split[$c]) < $chunks) || (($chunks == 1) && ($split[$c][0] == ''))))
unset($split[$c]);
return $split;
}