проблема с чтением PHP файлов CSV - PullRequest
3 голосов
/ 22 ноября 2008

Я пытаюсь прочитать данные из файла .csv, чтобы вывести их на веб-страницу в виде текста.

Я впервые делаю это, и у меня возникла небольшая неприятная проблема.

Мой файл .csv (который по умолчанию открывается в Excel) содержит несколько строк, и я читаю всю вещь как одну длинную строку.

как это:

$contents = file_get_contents("files/data.csv");

В этом примере файла, который я сделал, есть 2 строки.

Пол Блуберри-роуд 85 фонарик США, сумка 20 ноября, 2008, 16:39

Hellen Blueberryroad 85 us объектив 13мм, фонарик, сумка, ExtraBatteries ноябрь 20, 2008, 16: 41: 32

Но читаемая PHP строка выглядит так:

Пол; Blueberryroad 85; нас; фонарик, сумка; 20 ноября 2008 г., 16:39 Хеллен; Blueberryroad 85; нас; объектив 13 мм, фонарик, сумка, ExtraBatteries; 20 ноября 2008 г., 16: 41: 32

Я делю это на:

list($name[], $street[], $country[], $accessories[], $orderdate[]) = split(";",$contents);

То, что я хочу, это чтобы $ name [] содержал «Paul» и «Hellen» в качестве содержимого. И другие массивы для получения значений их соответствующих столбцов.

Вместо этого я получаю только Пола, а содержимое $ orderdate [] равно

20 ноября 2008 г., 16:39Hellen

Таким образом, все строки объединены. Может кто-нибудь показать мне, как я могу достичь того, что мне нужно?

РЕДАКТИРОВАТЬ: решение найдено, осталась только одна странная вещь:

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

$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
  $contents[] = fgetcsv($fo,0,';');
}
fclose($fo);

По какой-то причине, хотя мой CSV-файл содержит только 2 строки, он возвращает 2 массива и 1 логическое значение. Первые 2 - это мои массивы данных, а логическое значение равно 0.

Ответы [ 5 ]

11 голосов
/ 22 ноября 2008

Вам лучше использовать fgetcsv () , который знает о структуре файла CSV и имеет определенные опции для обработки файлов CSV. В качестве альтернативы вы можете использовать str_getcsv () вместо содержимого файла.

1 голос
/ 22 ноября 2008

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

$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
  $contents[] = fgetcsv($fo,0,';');
}
fclose($fo);

По какой-то причине, хотя мой CSV-файл содержит только 2 строки, он возвращает 2 массива и 1 логическое значение. Первые 2 - это мои массивы данных, а логическое значение равно 0.

1 голос
/ 22 ноября 2008

Функция 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];
}
0 голосов
/ 22 ноября 2008

Лучше всего, конечно, 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;
}
0 голосов
/ 22 ноября 2008

Замечание о fgetcsv верное.

Я все равно отвечу на ваш вопрос для образовательных целей. Во-первых, я не понимаю разницу между вашими данными (с запятыми) и «строкой, читаемой PHP» (она заменяет некоторые пробелы точкой с запятой, но не всеми?). PS: я посмотрел исходный код вашего сообщения, он выглядит как странное сочетание TSV (табуляция) и CSV (кома).

Кроме того, если вы хотите пойти по этому пути, вам нужно сначала разбить файл на строки, а затем на строки в полях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...