PHP читается в определенном столбце CSV-файла как массив

Я новичок в PHP и хотел бы иметь возможность читать файл csv, который имеет два столбца, один из которых является числом (вроде идентификатора), а другой содержит целочисленное значение. Я искал функцию fgetcsv, но не смог найти способ прочитать конкретный столбец из файла csv.

Я хотел бы получить все значения только из второго столбца, без заголовка.

Любой способ сделать это?

Это то, что у меня есть до сих пор:

$file = fopen('data.csv', 'r');
$line = fgetcsv($file);

А это пример данных из CSV-файла:

ID,Value
1,243.00
2,243.00
3,243.00
4,243.00
5,123.11
6,243.00
7,180.00
8,55.00
9,243.00

Любая помощь будет оценена по достоинству.

Спасибо.


person Josh Pullin    schedule 17.08.2012    source источник


Ответы (3)


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

$data = array();
while($row = fgetcsv($file)) {
   $data[] = $row;
}

Заголовок, который вы можете пропустить, выполнив fgetcsv один раз вне цикла, чтобы прочитать/удалить значения заголовка. И если вам нужен только второй столбец, вы можете сделать:

   $data[] = $row[1];

Однако, поскольку у вас есть данные, возможно, было бы полезно сохранить их, а также указать новый массив со значениями идентификатора в csv, чтобы вы также могли:

   $data[$row[0]] = $row[1];

и тогда ваш красивый блестящий новый массив будет в значительной степени точно соответствовать тому, что находится в csv, но как массив с ключом поля ID.

person Marc B    schedule 17.08.2012
comment
Это не работает. Я инициировал массив, затем сделал fopen, как в моем посте, затем цикл, который вы упомянули, но с использованием строки [1], но он не запускается. Есть идеи или я делаю что-то глупое? Спасибо за ваш ответ. - person Josh Pullin; 17.08.2012
comment
вы вообще ничего не получаете в $data или кучу пробелов? Попробуйте выполнить var_dump($row) внутри цикла и убедитесь, что файл правильно открыт (fopen вернет логическое значение false в случае ошибки, а не дескриптор файла). - person Marc B; 17.08.2012
comment
Вывел ли var_dump($row[1]) весь этот столбец, а не только одно значение? Вот часть того, что он печатает: string(6) 243.00 string(6) 243.00. Что мне сейчас нужно, так это все эти значения в отдельном массиве? - person Josh Pullin; 17.08.2012
comment
Было бы странно, если бы он печатал целый столбец томов — fgetcsv считывает только одну СТРОКУ данных. лучше убедитесь, что терминаторы строк входного файла (\r, \n и т. д.) верны. например. чтение текстового файла Windows на машине unix). проверьте php.net/fgetcsv, чтобы указать, какие символы использовать для всего этого. - person Marc B; 17.08.2012
comment
Хорошо спасибо. Я запускаю это на MacBook Pro, используя MAMP, может ли это быть причиной? Кроме того, если он просто читает второй столбец, используя $row[1], значения в файле csv не имеют запятой после. Может ли это быть другой причиной? - person Josh Pullin; 17.08.2012
comment
да, fgetcsv по умолчанию использует запятую в качестве разделителя, поэтому похоже, что ваш входной файл неверен на всех уровнях. вам придется прочитать справочную страницу и настроить параметры разделителя полей и символа окончания строки в соответствии с файлом. - person Marc B; 17.08.2012
comment
Хорошо спасибо. Мне предоставили файл, так как это своего рода мини-тест, поэтому они будут использовать файл по умолчанию для всех. Вероятно, они сделали небольшую вещь, чтобы увидеть, как мы обойдем это. Спасибо за помощь, надо будет посмотреть документацию. - person Josh Pullin; 17.08.2012
comment
Теперь у меня все работает, прочитав одну строку, однако, когда я помещаю строку $values[$amountRecords] = $row[1]; чтобы добавить значение в массив значений, он не работает, закомментируйте его. Есть идеи, почему эта строка не добавит значение в массив. Я могу заставить его печатать каждое отдельное значение, но не добавлять? Посмотрел в Интернете, там написано, что именно я сделал. Любые идеи? Спасибо. - person Josh Pullin; 18.08.2012

Вы также можете использовать этот класс http://code.google.com/p/php-csv-parser/

<?php

require_once 'File/CSV/DataSource.php';

$csv = new File_CSV_DataSource;
$csv->load('data.csv');
var_export($csv->connect());

?>
person roshan lal    schedule 29.08.2013

person    schedule
comment
ваша первая строка просто делает fgetcsv() трудный путь. - person Spudley; 18.08.2012
comment
@Spudley: Сложный способ получить весь файл с помощью одной строки кода. - person cHao; 12.12.2012