Как я могу разобрать CSV в массив с первым значением в качестве ключа? - PullRequest
6 голосов
/ 05 августа 2010

Итак, у меня есть CSV-файл, который выглядит так:

12345, Here is some text
20394, Here is some more text

Как я могу вставить это в массив, который выглядит так

$text = "12345" => "Here is some text",
        "20394" => "Here is some more text";

Это то, что мне в настоящее время приходилось получать на основе одноуровневого значения CSV

.
      if ($handle = fopen("$qid", "r")) {

          $csvData = file_get_contents($qid);
          $csvDelim = "\r";

          $qid = array();
          $qid = str_getcsv($csvData, $csvDelim);

      } else {

          die("Could not open CSV file.");

      }

Спасибо за ответы, но я все еще вижу потенциальную проблему. С этими решениями значения не будут сохранены таким образом:

$array[0] = 12345
$array[1] = Here is some text 20394
$array[2] = Here is some more text

Если бы я попробовал это на примере csv выше, как бы был структурирован массив?

Ответы [ 5 ]

11 голосов
/ 05 августа 2010

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

$a = array();
$f = fopen(....);
while ($line = fgetcsv($f))
{
    $key = array_shift($line);
    $a[$key] = $line;
}
fclose($f);
var_dump($a);
3 голосов
/ 27 ноября 2010

Предполагая, что первая строка в файле CSV содержит заголовки столбцов, это создаст ассоциативный массив, использующий эти заголовки для данных каждой строки:

$filepath = "./test.csv";
$file = fopen($filepath, "r") or die("Error opening file");
$i = 0;

while(($line = fgetcsv($file)) !== FALSE) {
    if($i == 0) {
        $c = 0;
        foreach($line as $col) {
            $cols[$c] = $col;
            $c++;
        }
    } else if($i > 0) {
        $c = 0;
        foreach($line as $col) {
            $data[$i][$cols[$c]] = $col;
            $c++;
        }
    }
    $i++;
}

print_r($data);
0 голосов
/ 05 августа 2010

В вашем новом файле с двумя столбцами $ qid должен стать массивом с двумя значениями для каждой строки.

$csvDelim = ",";
$qid = str_getcsv($csvData, $csvDelim);
$text[$qid[0]] = $qid[1];
0 голосов
/ 05 августа 2010
$csv_lines = explode('\n',$csv_text);
foreach($csv_lines as $line) {
  $csv_array[] = explode(',',$line,1);
}

edit - на основе кода, размещенного после исходного вопроса:

  if ($handle = fopen("$qid", "r")) {

      $csvData = file_get_contents($qid);
      $csvDelim = "\r"; // assume this is the line delim?

      $csv_lines = explode($csvDelim,$csvData);
      foreach($csv_lines as $line) {
        $qid[] = explode(',',$line,1);
      }

  } else {

      die("Could not open CSV file.");

  }
0 голосов
/ 05 августа 2010

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

http://at2.php.net/fgetcsv

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