Question

I have this script that I did, it basically grabs all the files in my "logs" folder and merge them all in one array file, my only problem is that, sometimes the script breaks if there is blank line or empty line! how can I tell it to automatically skip blank empty lines and go to next? blank lines are not necessarily at the top or bottom! could be in the middle of the csv file

<?php
    $csv = array();
    $files = glob('../logs/*.*');
    $out = fopen("newfile.txt", "w");

    foreach($files as $file){
        $in = fopen($file, "r");

    while (($result = fgetcsv($in)) !== false)

        {   
            $csv[] = $result;
        }

        fclose($in);
        fclose($out);
    }

    print json_encode(array('aaData' => $csv ));
?>
Was it helpful?

Solution

As you can read in the documentation for fgetcsv():

A blank line in a CSV file will be returned as an array comprising a single null field, and will not be treated as an error.

Checking for that before adding it to your data array should be sufficient:

while (($result = fgetcsv($in)) !== false) {
    if (array(null) !== $result) { // ignore blank lines
        $csv[] = $result;
    }
}

OTHER TIPS

This works 100% tested, simplest way. The explanation is that blank lines make fgetcsv return a non-empty array with just a null element inside.

if ($result[0] == NULL)
    continue;

In short

$csv = array_map('str_getcsv', file($file_path, FILE_SKIP_EMPTY_LINES|FILE_IGNORE_NEW_LINES));

Explanation

  1. file reads the content of the file into an array. The FILE_SKIP_EMPTY_LINES will skip the empty lines in the file.
  2. array_map will apply the function str_getcsv on each element of the array. str_getcsv will parse the string input for fields in csv format and return an array containing the fields.

Read more about str_getcsv

Read more about file

Read more about array_map

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top