it-swarm.dev

PHP CSV string to array

أحاول تحليل سلسلة CSV إلى صفيف في PHP. تحتوي سلسلة CSV على السمات التالية:

Delimiter: ,
Enclosure: "
New line: \r\n

مثال على المحتوى:

"12345","Computers","Acer","4","Varta","5.93","1","0.04","27-05-2013"
"12346","Computers","Acer","5","Decra","5.94","1","0.04","27-05-2013"

عندما أحاول تحليلها مثل هذا:

$url = "http://www.url-to-feed.com";
$csv = file_get_contents($url);
$data = str_getcsv($csv);
var_dump($data);

يتم ربط العنصر الأول والأول في سلسلة واحدة:

[0]=> string(5) "12345"
...
[7]=> string(4) "0.04"
[8]=> string(19) "27-05-2013
"12346""

كيف يمكنني اصلاح هذا؟ سيكون موضع تقدير أي مساعدة.

37
Tomzie

افعل هذا:

$csvData = file_get_contents($fileName);
$lines = explode(PHP_EOL, $csvData);
$array = array();
foreach ($lines as $line) {
    $array[] = str_getcsv($line);
}
print_r($array);

سوف يعطيك إخراج مثل هذا:

Array
(
    [0] => Array
        (
            [0] => 12345
            [1] => Computers
            [2] => Acer
            [3] => 4
            [4] => Varta
            [5] => 5.93
            [6] => 1
            [7] => 0.04
            [8] => 27-05-2013
        )

    [1] => Array
        (
            [0] => 12346
            [1] => Computers
            [2] => Acer
            [3] => 5
            [4] => Decra
            [5] => 5.94
            [6] => 1
            [7] => 0.04
            [8] => 27-05-2013
        )

)

آمل أن يكون هذا من بعض المساعدة.

103
saran banerjee

مفيد oneliner:

$csv = array_map('str_getcsv', file('data.csv'));
35
Gaui

يجب عليك استخدام fgetcsv. نظرًا لأنه لا يمكنك استيراد ملف كدفق لأن الملف بتنسيق csv هو متغير ، فيجب عليك محاكاة ساخرة للسلسلة كملف باستخدام php://temp أو php://memory أول:

$fp = fopen("php://temp", 'r+');
fputs($fp, $csvText);
rewind($fp);

إذن لن تواجه مشكلة في استخدام fgetcsv:

$csv = [];
while ( ($data = fgetcsv($fp) ) !== FALSE ) {
    $csv[] = $data;
}

$data ستكون مجموعة من سطر csv واحد (والذي قد يشمل فواصل الأسطر أو الفواصل ، إلخ) ، كما ينبغي.

21
iateadonut

لقد استخدمت الوظيفة التالية لتحليل سلسلة CSV إلى مجموعة النقابي

public function csvToArray($file) {
    $rows = array();
    $headers = array();
    if (file_exists($file) && is_readable($file)) {
        $handle = fopen($file, 'r');
        while (!feof($handle)) {
            $row = fgetcsv($handle, 10240, ',', '"');
            if (empty($headers))
                $headers = $row;
            else if (is_array($row)) {
                array_splice($row, count($headers));
                $rows[] = array_combine($headers, $row);
            }
        }
        fclose($handle);
    } else {
        throw new Exception($file . ' doesn`t exist or is not readable.');
    }
    return $rows;
}

إذا كان اسم ملف csv هو mycsv.csv ، فعندئذٍ يمكنك استدعاء هذه الوظيفة كـ:

$dataArray = csvToArray(mycsv.csv);

يمكنك الحصول على هذا البرنامج النصي أيضًا في http://www.scriptville.in/parse-csv-data-to-array/

6
Rajen K Bhagat

نسخة أقصر قليلاً ، دون المتغير الثاني غير الضروري:

$csv = <<<'ENDLIST'
"12345","Computers","Acer","4","Varta","5.93","1","0.04","27-05-2013"
"12346","Computers","Acer","5","Decra","5.94","1","0.04","27-05-2013"
ENDLIST;

$arr = explode("\n", $csv);
foreach ($arr as &$line) {
  $line = str_getcsv($line);
}
1
user

تعديل الإجابات السابقة باستخدام array_map.
نسف بيانات ملف CSV بسطور متعددة.

$csv = array_map('str_getcsv', explode("\n", $csvData));
0
Joseph D.

إذا كنت بحاجة إلى اسم لأعمدة csv ، يمكنك استخدام هذه الطريقة

 $example= array_map(function($v) {$column = str_getcsv($v, ";");return array("foo" => $column[0],"bar" => $column[1]);},file('file.csv'));
0
Ramsés Fernández

إذا كان لديك موجز ويب للرجوع/الأسطر داخل الأعمدة ، فلن تعمل str_getcsv.

حاول https://github.com/synappnz/php-csv

استعمال:

include "csv.php";
$csv = new csv(file_get_contents("filename.csv"));
$rows = $csv->rows();
foreach ($rows as $row)
{
  // do something with $row
}
0
Stacey Richards