我有一个CSV文件,其中的数据是横向的。例如:
name, test name age, 20 gender,Male
其中第一列是标题,第二列是数据,我尝试使用laravel maatwebsite/Excel和阅读文件后的响应,第一行被视为标题。(name和test name)。是否有任何方法来读取这种类型的CSV文件在laravel使用maatwebsite/Excel
laravel maatwebsite/Excel
name
test name
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' => ','))
u1ehiz5o2#
PHP有一个内置函数http://php.net/manual/en/function.str-getcsv.php
57hvy0tb3#
对于这么小的CSV并不重要,但是试着要求那些给予CSV的人正确地格式化它们,而不是转置它们,或者自己使用online solutions来这样做。下面是解决方案,但是它将整个数组存储在内存中,尽管第一个示例中的包是专门为避免这种情况而设计的。
您可以像这样使用Spatie的simple-excel:
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。(问题已关闭,因为该解决方案的内存效率不高)
正如“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));
qyswt5oh4#
面向2022年读者:我现在使用的是:https://github.com/spatie/simple-excel由于使用了LazyCollections,所以工作起来非常有魅力,而且不占用内存
4条答案
按热度按时间cqoc49vn1#
您可以使用此函数
u1ehiz5o2#
PHP有一个内置函数http://php.net/manual/en/function.str-getcsv.php
57hvy0tb3#
对于这么小的CSV并不重要,但是试着要求那些给予CSV的人正确地格式化它们,而不是转置它们,或者自己使用online solutions来这样做。下面是解决方案,但是它将整个数组存储在内存中,尽管第一个示例中的包是专门为避免这种情况而设计的。
与 composer
您可以像这样使用Spatie的
simple-excel
:我还为您的用例打开了一个issue。(问题已关闭,因为该解决方案的内存效率不高)
没有 composer
正如“online托马斯”所说,有一个本地PHP函数可以实现这一点,我发现它最容易使用,一般来说,如下所示:
在您的情况下使用结束符,或者如果您需要除','以外的分隔符等:
qyswt5oh4#
面向2022年读者:我现在使用的是:https://github.com/spatie/simple-excel
由于使用了LazyCollections,所以工作起来非常有魅力,而且不占用内存