Вопрос

Я пытаюсь прочитать данные из файла .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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top