替换PHP中的CSV行,内存错误

I have a csv file that is 2Mb size, and has pipe delimiter. I would like to take the first row and replace its data then resave the file. Here is what I did :

//Creating a new first row with the modified data.
$file = fopen($path,"r");//$path is where the file is located : outputs/my_file.csv
$size = filesize($path);
$firstLine = fgetcsv(fopen($path,"r")); //$firstLine has all the data of the first row as array
fclose($file);
$firstLine = explode("|", $firstLine[0]);//To get each column row
$newHeader = array();
    for($i = 0; $i<sizeof($firstLine ); $i++){
        if($i == 4){
            array_push($newHeader, "modified column in row 1 ");//Only column 4 in row 1 is modified
        }else{
            array_push($newHeader, $firstLine [$i]);
        }
    }
$Header = implode("|", $newHeader);

//Creating the new csv file
$row = 0;
    while (($data = fgetcsv(fopen($path,"r"), "|")) !== false) {
        if($row == 0){
            $data[0] = $Header;
        }
        $newCsvData[] = $data;
    }
    return $newCsvData; //I wanted to display the new content of the csv before saving it

This code should print the new content of the csv file that I will store but I get an error : Allowed memory size of 536870912 bytes exhausted (tried to allocate 332 bytes) How can I do that in a very fast way ? the file is about 19122 row.

Thanks

If it's only 2mb, maybe read the entire file into memory and then write out a new file (overwriting the previous file). Here are some helper functions to help you read and write the file, and I'm certain you're proficient in editing the resulting array:

/**
  * Reads a file into an array
  *
  * @param $FILE string the file to open
  *
  * @return $lines The Lines of the file as an array
  */
public static function readFile($FILE) {

    $lines = array(); // the array to store each line of the file in

    $handle = fopen($FILE, "r"); 
    if ($handle) { 

        // $FILE successfully opened for reading, 

        while (($line = fgets($handle)) !== false) {
            $lines[] = $line; //add each line of the file to $lines
        } 

    } else {
        throw new Exception("error opening the file...");
    } 

    fclose($handle); // close the file

    return $lines; // return the lines of the file as an array
}

 /**
   * Writes the $lines of a file into $FILE
   *
   * @param $FILE string The file to write
   * @param $lines array An array containing the lines of the file
   *
   * @return $result int|NULL The number of bytes written, or null on failure. See: php.net/fwrite#refsect1-function.fwrite-returnvalues
   */
public static writeFile($FILE, $lines) {

    // Add newline at the end of each line of the array
    // output is now a single string which we will write in one pass 
    // (instead of line-by-line)
    $output = implode("
", $lines);

    $handle = fopen($FILE, "w+"); 
    if ($handle) { 

        // $FILE successfully opened for writing, write to the file
        $result = fwrite($handle, $output);

    } else {
        throw new Exception("error opening the file...");
    } 

    fclose($handle); // close the file

    return $result; // The number of bytes written to the file, or NULL on failure
}
<?php
$source = fopen('filename','r');
$destination = fopen('newfilename','w');
//write new header to new file
fwrite($destination,"your|replacement|header
");
//set the pointer in the old file to the second row
fgets($source);
//copy the entire stream
stream_copy_to_stream($source,$destination);
//rename the newfilename to the old filename
rename('newfilename','filename');
//check what memory we used:
var_dump(memory_get_peak_usage());

That resulted in 142260 bytes used of memory at its peak for a 2MB file. BTW: the memory usage of a 2GB file is exactly if I test it here.