不必加載的所有文件(使用白白內存),你可以逐行讀取文件(作爲流)並構建一個生成器函數,它可以逐個返回您感興趣的記錄。這樣你不需要刪除,你只需要使用條件並選擇你想要的。示例:
function getLineFromFileHandler($fh, $headers = false) {
// initializations
$sectionSeparator = str_repeat('-', 62);
$newline = "\r\n";
$sectionSeparatorNL = $sectionSeparator . $newline;
$rowSeparatorNL = ',' . $newline;
// skip title/subtitle (feel free to add a param to yield them)
$title = stream_get_line($fh, 4096, $sectionSeparatorNL);
$subtitle = stream_get_line($fh, 4096, $sectionSeparatorNL);
// get the field names
$fieldNamesLine = stream_get_line($fh, 4096, $rowSeparatorNL);
// return the records
if ($headers) {
$fieldNames = array_map('trim', explode(',', $fieldNamesLine));
while (($line = stream_get_line($fh, 4096, $rowSeparatorNL)) !== false &&
strpos($line, $sectionSeparator) === false)
yield array_combine($fieldNames, explode(',', $line));
} else {
while (($line = stream_get_line($fh, 4096, $rowSeparatorNL)) !== false &&
strpos($line, $sectionSeparator) === false)
yield explode(',', $line);
}
}
$fh = fopen('csv.txt', 'r');
foreach(getLineFromFileHandler($fh, true) as $record)
print_r($record);
fclose($fh);
此示例將每條記錄顯示爲關聯數組,其中字段名稱爲鍵。正如你所看到的,你可以刪除生成器函數的第二個參數來獲得索引數組。隨意選擇最方便的方式將記錄插入到數據庫中(逐個,逐塊或全部一次性)。
歡迎來到SO。 請閱讀[我可以問哪些主題](http://stackoverflow.com/help/on-topic) 和[如何提出一個好問題](http://stackoverflow.com/help/how-to - 問) 和[完美的問題](http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/) SO是**不是免費的編碼或教程服務* *你必須表明你已經努力解決你自己的問題。 – RiggsFolly
除了@ RiggsFolly的評論,這個問題已經解決了幾次 - ['str_getcsv()'](http://php.net/manual/en/function.str-getcsv.php)或['explode ()'](http://php.net/manual/en/function.explode.php)將是一個很好的起點(並且會通過簡單的搜索來顯示自己...) – Jan
如果你使用cron來運行這個任務,你甚至不需要使用PHP。使用'head'和'tail'來提取你需要的文件部分,然後使用'mysql'的'LOAD DATA INFILE'加載它。 –