PHP में CSV files को parse करने के built-in functions और सर्वोत्तम अभ्यास।
विधि 1: fgetcsv() - Streaming/Large Files के लिए (अनुशंसित)
<?php
function parseCsv($filePath, $delimiter = ',', $enclosure = '"', $escape = '\\') {
$data = [];
$row = 0;
if (($handle = fopen($filePath, 'r')) !== false) {
// Header row पढ़ें (यदि मौजूद है)
$headers = fgetcsv($handle, 0, $delimiter, $enclosure, $escape);
while (($rowData = fgetcsv($handle, 0, $delimiter, $enclosure, $escape)) !== false) {
$row++;
// Skip empty rows
if (array_filter($rowData) === []) continue;
// Header के साथ associative array बनाएं
if ($headers) {
$data[] = array_combine($headers, $rowData);
} else {
$data[] = $rowData;
}
}
fclose($handle);
}
return $data;
}
// उपयोग
$csvData = parseCsv('data.csv');
print_r($csvData);
विधि 2: str_getcsv() - Small Files/Strings के लिए (PHP 5.3+)
<?php
// Entire file read करें
$content = file_get_contents('data.csv');
$lines = explode("\n", $content);
$data = [];
$headers = null;
foreach ($lines as $line) {
$line = trim($line);
if ($line === '') continue;
$row = str_getcsv($line, ',', '"', '\\');
if ($headers === null) {
$headers = $row;
} else {
$data[] = array_combine($headers, $row);
}
}
print_r($data);
विधि 3: SplFileObject (Object-Oriented, Memory Efficient)
<?php
$file = new SplFileObject('data.csv');
$file->setFlags(
SplFileObject::READ_CSV |
SplFileObject::READ_AHEAD |
SplFileObject::SKIP_EMPTY
);
$file->setCsvControl(',', '"', '\\');
$headers = $file->current();
$file->next();
$data = [];
foreach ($file as $row) {
$data[] = array_combine($headers, $row);
}
print_r($data);
विधि 4: League/CSV Library (Production के लिए अनुशंसित)
// Composer: composer require league/csv
use League\Csv\Reader;
$csv = Reader::createFromPath('data.csv', 'r');
$csv->setHeaderOffset(0); // First row as headers
$records = $csv->getRecords(); // Iterator (memory efficient)
foreach ($records as $record) {
// $record is associative array
echo $record['name'] . "\n";
}
// या सभी एक साथ
$allData = iterator_to_array($records);
आम CSV समस्याएं और समाधान
| समस्या | समाधान |
|---|---|
| Quoted fields में commas | fgetcsv() automatically handles |
| Quoted fields में newlines | fgetcsv() handles, str_getcsv() नहीं |
| Different delimiters (;, \t, |) | Delimiter parameter specify करें |
| BOM (Byte Order Mark) | fgets() first line से BOM strip करें |
| Encoding issues (UTF-8, UTF-16) | mb_convert_encoding() उपयोग करें |
| Large files (memory) | Streaming (fgetcsv, SplFileObject) उपयोग करें |
BOM Handling के साथ Robust Parser
<?php
function parseCsvRobust($filePath, $delimiter = ',') {
$handle = fopen($filePath, 'r');
if (!$handle) throw new Exception("Cannot open file");
// BOM detect और remove करें
$bom = fread($handle, 3);
if ($bom !== "\xEF\xBB\xBF") {
rewind($handle); // Not UTF-8 BOM, rewind
}
$headers = fgetcsv($handle, 0, $delimiter);
if (!$headers) return [];
// Headers trim करें
$headers = array_map('trim', $headers);
$data = [];
while (($row = fgetcsv($handle, 0, $delimiter)) !== false) {
if (array_filter($row) === []) continue; // Skip empty
$data[] = array_combine($headers, $row);
}
fclose($handle);
return $data;
}