agentsib/csv-reader

简单读取CSV文件的方法

v1.0.1 2024-02-21 09:19 UTC

This package is auto-updated.

Last update: 2024-09-21 10:28:36 UTC


README

简单读取CSV文件的方法

Latest Stable Version Total Downloads Latest Unstable Version License

安装

通过 Composer 安装

composer require agentsib/csv-reader

读取带标题的CSV文件

示例文件 test.csv

id;name;value
1;test1;value1
2;test2;value2

读取文件

<?

$resource = fopen('test.csv','r');
$csv = new AgentSIB\CsvReader\CsvReader($resource, true, ';');

// Get headers array
$csv->getHeaders(); // ["id", "name", "value"]
// Check header 
$csv->hasHeader('id'); // true

foreach ($csv as $row) {
    // Get value by column number
    echo $row[1]; // test1,test2
    // Get value by column name
    echo $row['value']; // value1,value2
    // Get value by not exists column
    echo $row['not_exists']; // null
    
    // Check value for exists
    isset($row[1]); // true
    isset($row[20]); // false
    isset($row['value']); //true
    isset($row['not_exists']); //false 
}

$csv->rewind();
$firstRow = $csv->current();
foreach ($firstRow as $key => $value) {
    echo $key.' => '.$value.PHP_EOL;
}
// id => 1
// name => test1
// value => value1

// Replace headers example
$csv->replaceHeaders(['prop_id', 'prop_name', 'prop_value']);

$csv->getHeaders(); // ['prop_id', 'prop_name', 'prop_value']

$csv->rewind();
$firstRow = $csv->current();
foreach ($firstRow as $key => $value) {
    echo $key.' => '.$value.PHP_EOL;
}
// prop_id => 1
// prop_name => test1
// prop_value => value1

// Replace headers example 2
$csv->replaceHeaders(['prop_id', 'prop_name']);

$csv->getHeaders(); // ['prop_id', 'prop_name']

$csv->rewind();
$firstRow = $csv->current();
foreach ($firstRow as $key => $value) {
    echo $key.' => '.$value.PHP_EOL;
}
// prop_id => 1
// prop_name => test1

读取不带标题的CSV文件

示例文件 test.csv

1;test1;value1
2;test2;value2

读取文件

<?

$resource = fopen('test.csv','r');
$csv = new AgentSIB\CsvReader\CsvReader($resource, false, ';');

// Get headers array
$csv->getHeaders(); // []

foreach ($csv as $row) {
    // Get value by column number
    echo $row[1]; // test1,test2
    echo $row[20]; // null,null

    // Check value for exists
    isset($row[1]); // true
    isset($row[20]); // false
}

$csv->rewind();
$firstRow = $csv->current();
foreach ($firstRow as $key => $value) {
    echo $key.' => '.$value.PHP_EOL;
}
// 0 => 1
// 1 => test1
// 2 => value1

// Replace headers example
$csv->replaceHeaders(['prop_id', 'prop_name', 'prop_value']);

$csv->getHeaders(); // ['prop_id', 'prop_name', 'prop_value']

$csv->rewind();
$firstRow = $csv->current();
foreach ($firstRow as $key => $value) {
    echo $key.' => '.$value.PHP_EOL;
}
// prop_id => 1
// prop_name => test1
// prop_value => value1

// Replace headers example 2
$csv->replaceHeaders(['prop_id', 'prop_name']);

$csv->getHeaders(); // ['prop_id', 'prop_name']

$csv->rewind();
$firstRow = $csv->current();
foreach ($firstRow as $key => $value) {
    echo $key.' => '.$value.PHP_EOL;
}
// prop_id => 1
// prop_name => test1

您可以在初始化时设置标题

<?php

$resource = fopen('test.csv','r');
$csv = new AgentSIB\CsvReader\CsvReader($resource, ['id', 'name', 'value'], ';');

// Get headers array
$csv->getHeaders(); // ['id', 'name', 'value']

$csv->rewind();
$firstRow = $csv->current();
foreach ($firstRow as $key => $value) {
    echo $key.' => '.$value.PHP_EOL;
}
// id => 1
// name => test1
// value => value1

已知问题

如果您使用 php://input 流,您需要将内容保存到另一个流中,因为在这种情况下 rewind 函数不起作用。例如

<?php

$resource = fopen('php://input', 'rb');

$r = fopen('php://memory', 'r+');
fwrite($r, stream_get_contents($resource));
rewind($r);

$csv = new AgentSIB\CsvReader\CsvReader($r);