PHP Laravel读取csv

uz75evzq  于 2022-12-06  发布在  PHP
关注(0)|答案(4)|浏览(199)

我有一个CSV文件,其中的数据是横向的。例如:

name, test name
age, 20
gender,Male

其中第一列是标题,第二列是数据,我尝试使用laravel maatwebsite/Excel和阅读文件后的响应,第一行被视为标题。(nametest name)。
是否有任何方法来读取这种类型的CSV文件在laravel使用maatwebsite/Excel

cqoc49vn

cqoc49vn1#

您可以使用此函数

public function readCSV($csvFile, $array)
{
    $file_handle = fopen($csvFile, 'r');
    while (!feof($file_handle)) {
        $line_of_text[] = fgetcsv($file_handle, 0, $array['delimiter']);
    }
    fclose($file_handle);
    return $line_of_text;
}
$csvFileName = "test.csv";
$csvFile = public_path('csv/' . $csvFileName);
$this->readCSV($csvFile,array('delimiter' => ','))
57hvy0tb

57hvy0tb3#

对于这么小的CSV并不重要,但是试着要求那些给予CSV的人正确地格式化它们,而不是转置它们,或者自己使用online solutions来这样做。下面是解决方案,但是它将整个数组存储在内存中,尽管第一个示例中的包是专门为避免这种情况而设计的。

与 composer

您可以像这样使用Spatie的simple-excel

$csv = __DIR__ . '/data.csv';
$data = [];
SimpleExcelReader::create($csv)
    // ->useDelimiter(';') // Optional
    ->noHeaderRow() // Optional
    ->getRows()
    ->each(function(array $row) use (&$data) {
        $length = count($row);
        for ($i = 1; $i < $length; $i++) {
            $data[$i - 1] ??= [];
            $data[$i - 1][$row[0]] = $row[$i];
        }
});

我还为您的用例打开了一个issue(问题已关闭,因为该解决方案的内存效率不高)

没有 composer

正如“online托马斯”所说,有一个本地PHP函数可以实现这一点,我发现它最容易使用,一般来说,如下所示:

$csv = __DIR__ . '/data.csv';
$data = array_map('str_getcsv', file($csv));
  • 警告:如果字段包含换行符,则不会产生所需的结果 *

在您的情况下使用结束符,或者如果您需要除','以外的分隔符等:

$csv = __DIR__ . '/data.csv';
$data = [];
array_map(function ($line) {
    $row = str_getcsv($line);
    $length = count($row);
    for ($i = 1; $i < $length; $i++) use (&$data) {
       $data[$i - 1] ??= [];
       $data[$i - 1][$row[0]] = $row[$i];
    }
}, file($csv));
qyswt5oh

qyswt5oh4#

面向2022年读者:我现在使用的是:https://github.com/spatie/simple-excel
由于使用了LazyCollections,所以工作起来非常有魅力,而且不占用内存

相关问题