簡體   English   中英

從不帶循環的CSV文件中獲取列值

[英]Get column values from a CSV file w/o for loops

我面前有一個很大的CSV文件。 10列3000行 我正在尋找一個PHP庫,可以讓我簡單地獲取給定列中的所有值。 像這樣:

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

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

但這似乎沒有我需要的...。我可能是錯的。 我不需要的是foreach解決方案。

解析CSV是我最喜歡的...盡管PHP的內置函數也不錯...

ParseCSV

試試這個(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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM