【问题标题】:PHP read in specific csv file column as an arrayPHP以数组形式读取特定的csv文件列
【发布时间】:2012-08-17 15:50:27
【问题描述】:

我是 PHP 新手,希望能够读取包含两列的 csv 文件,一列是数字(有点像 ID),另一列是整数值。我查找了 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

任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: php csv fgetcsv


    【解决方案1】:

    fgetcsv() 一次只读取文件的一行。您必须循环读取文件以获取所有内容:

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

    您可以通过在循环外执行 fgetcsv 来跳过标题,以读取/删除标题值。如果你只想要第二列,你可以这样做:

       $data[] = $row[1];
    

    但是,由于您已经在其中保存了数据,因此保留它可能会很有用,并使用 csv 中的 ID 值键入您的新数组,因此您还可以:

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

    然后您漂亮的闪亮新数组将与 csv 中的内容几乎完全匹配,但作为由 ID 字段键入的数组。

    【讨论】:

    • 这似乎不起作用。我已经启动了数组,然后像我的帖子中那样完成了 fopen,然后是你提到的循环,但使用了 row[1] 但它没有运行。有什么想法还是我在做一些愚蠢的事情?感谢您的回复。
    • 您在 $data 中什么也没有得到,还是一堆空白?尝试在循环中执行 var_dump($row),并确保文件已正确打开(fopen 将在失败时返回布尔值 false,而不是文件句柄)。
    • var_dump($row[1]) 是否打印了整个列而不仅仅是单个值?这是它打印的一些内容:string(6) "243.00" string(6) "243.00"。我现在需要的是一个单独的数组中的所有这些值?
    • 如果它打印一整列卷会很奇怪 - fgetcsv 只读取一行数据。最好确保输入文件的行终止符(\r\n 等)正确无误。在 Unix 机器上读取 Windows 文本文件)。检查php.net/fgetcsv 以指定用于所有这些的字符。
    • 好的,谢谢。我在使用 MAMP 的 MacBook Pro 上运行它,这可能是一个原因吗?此外,如果它只是使用 $row[1] 读取第二列,则 csv 文件中的值后面没有逗号。这可能是另一个原因吗?
    【解决方案2】:
    $csv = array_map("str_getcsv", file("data.csv", "r")); 
    $header = array_shift($csv); 
    // Seperate the header from data
    
    $col = array_search("Value", $header); 
     foreach ($csv as $row) {      
     $array[] = $row[$col]; 
    }
    // Iterate through data set, creating array from Value column
    

    【讨论】:

    • 你的第一行代码只是在 fgetcsv() 上做了很困难的事情。
    • @Spudley: "The hard way" 用一行代码获取整个文件。
    【解决方案3】:
    $header = fgetcsv($h);
    $rows = array();
    while ($row = fgetcsv($h)) {
        $rows []= array_combine($header, $row);
    }
    

    【讨论】:

      【解决方案4】:
      $fp = fopen($filePath, "r+");
      $header = fgetcsv($fp);
      while ($members = fgetcsv($fp)) {
          $i = 0;
          foreach ($members as $mem) {
              $membersArray[ $i ][ ] = $mem;
              $i++;
          }
      }
      
      $newArray = array_combine($header, array_map("array_filter",$membersArray));
      

      【讨论】:

        【解决方案5】:

        你也可以使用这个类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());
        
        ?>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-16
          • 2016-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-14
          • 2020-08-28
          相关资源
          最近更新 更多