【问题标题】:Get column values from a CSV file w/o for loops从没有循环的 CSV 文件中获取列值
【发布时间】:2013-07-29 22:25:31
【问题描述】:

我面前有一个大的 CSV 文件。 10 列,3000 行。我正在寻找一个 PHP 库,它可以让我简单地获取给定列中的所有值。像这样的:

$columnValues = $file->getColumnValues('F');

我看过: http://pear.php.net/package/Spreadsheet_Excel_Writer/

但这似乎没有我需要的东西....我可能是错的。我不寻找的是 foreach 解决方案。

【问题讨论】:

  • 不存在这样的生物(如果存在,它仍然需要循环);你需要循环,除非你卖给命令行并使用 awk .... 但如果文件是 CSV 文件,那么你用 fgetcsv() 循环
  • 数据库非常适合这种事情:)
  • 如果你循环或实用程序函数循环遍历行有什么区别?或者,如果这是它的主要用途,为什么不自己重组 CSV 数组?
  • unix cut 命令效果很好
  • @immulat ... 最初我不想将这些数据放入数据库中,原因有几个。但在做了更多思考之后,这就是我要继续下去的方式。谢谢!

标签: php excel csv scripting


【解决方案1】:

解析 CSV 是我的最爱……虽然 PHP 的内置函数也不错……

ParseCSV

【讨论】:

    【解决方案2】:

    试试这个(PHP >= 5.1.0):

    echo getRowColumnValue(__DIR__.'/csvtest.csv', 2, 1); // third row, second column
    
    function getRowColumnValue($path, $row, $column, $delimiter = ';')
    {
        $file = new SplFileObject($path);        
        $file->seek($row);
        //$cols = $file->fgetcsv($delimiter); // bug? gets next row
        $cols = str_getcsv($file->current(), $delimiter);
        return (isset($cols[$column])) ? $cols[$column] : null;
    }
    

    或者像 alpha 一样支持 excel 的小类:

    // Example 1:
    $file = new CsvFile(__DIR__.'/csvtest.csv');
    $file->seekToRow(2);
    echo $file->getColumnValue('B'); 
    // also supports integers -> echo $file->getColumnValue(1);
    
    // Example 2:
    $file = new CsvFile(__DIR__.'/csvtest.csv');
    print_r($file->getColumnValues('B')); // get column values as array -> row 2
    
    class CsvFile extends SplFileObject
    {
        public function __construct($filename, $delimiter = ';', $enclosure = "\"", $escape = "\\")
        {
            parent::__construct($filename);
            $this->setFlags(SplFileObject::READ_CSV);
            $this->setCsvControl($delimiter, $enclosure, $escape);
        }
    
        protected function _getNumber($alpha)
        {
            $alpha = preg_replace("/[^A-Z]+/", "", strtoupper($alpha));
            $i = 0;
            $len = strlen($alpha);
            for ($j=0;$j<$len;$j++) {
                $i += (ord($alpha[$j]) - 65) + ($j * 26);
            }
            return $i;
        }
    
        public function seekToRow($row)
        {
            $row = (is_string($row)) ? $this->_getNumber($row) : $row;
            $this->seek($row);
        }
    
        public function getColumnValue($column)
        {
            $column = (is_string($column)) ? $this->_getNumber($column) : $column;
            $cols = $this->current();
            return (isset($cols[$column])) ? $cols[$column] : null;
        }
    
        public function getColumnValues($row)
        {
            $this->seekToRow($row);
            return $this->current();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 2018-07-16
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      相关资源
      最近更新 更多