それが古いスレッドであることは知っていますが、私は自分自身に似たものを探していて、このトピックに出くわしましたが、ここで提供された答えはどれも私を助けませんでした。
したがって、私は先に進んで、テストされ、完全に機能する(改善できる)独自のソリューションを用意しました。
example.csv
次のダミーデータを含むという名前のCSVファイルがあるとします(意図的に、最後の行の6番目には、1つの追加データが含まれ、次に他の行が含まれます)。
Name,Country,Age
John,Ireland,18
Ted,USA,22
Lisa,UK,23
Michael,USA,20
Louise,Ireland,22,11
ここで、CSVファイルをチェックして、すべての行に同じ数のデータがあることを確認すると、次のコードブロックがトリックを実行し、エラーが発生した行を特定します。
function validateCsvColumnLength($pathToCsvFile)
{
if(!file_exists($pathToCsvFile) || !is_readable($pathToCsvFile)){
throw new \Exception('Filename doesn`t exist or is not readable.');
}
if (!$handle = fopen($pathToCsvFile, "r")) {
throw new \Exception("Stream error");
}
$rowLength = [];
$rowNumber = 0;
while (($data = fgetcsv($handle)) !== FALSE) {
$rowLength[] = count($data);
$rowNumber++;
}
fclose($handle);
$rowKeyWithError = array_search(max($rowLength), $rowLength);
$differentRowCount = count(array_unique($rowLength));
// if there's a row that has more or less data, throw an error with the line that triggered it
if ($differentRowCount !== 1) {
throw new \Exception("Error, data count from row {$rowKeyWithError} does not match header size");
}
return true;
}
実際にテストするには、var_dump()を実行して結果を確認します。
var_dump(validateCsvColumnLength('example.csv'));