PHPでCSV文字列を配列に解析しようとしています。 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);
最後と最初の要素は1つの文字列に連結されます:
[0]=> string(5) "12345"
...
[7]=> string(4) "0.04"
[8]=> string(19) "27-05-2013
"12346""
どうすれば修正できますか?任意の助けをいただければ幸いです。
これを行う:
$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
)
)
これが助けになることを願っています。
便利なワンライナー:
$csv = array_map('str_getcsv', file('data.csv'));
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の単一行(改行やコンマなどが含まれる場合があります)の配列になります。
私は次の関数を使用して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/ でも取得できます
不要な2番目の変数を含まない、わずかに短いバージョン:
$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);
}
array_map
を使用した以前の回答の修正。
複数行でCSVデータを爆発させます。
$csv = array_map('str_getcsv', explode("\n", $csvData));
Csv列の名前が必要な場合は、このメソッドを使用できます
$example= array_map(function($v) {$column = str_getcsv($v, ";");return array("foo" => $column[0],"bar" => $column[1]);},file('file.csv'));
列内にキャリッジリターン/ラインフィードがある場合、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
}