phpjsonlaravelcsv

convert csv file to json object with Laravel


I am doing a project with Laravel 7. I have to read a csv file and through a controller passing the data in json format to a view. Unfortunately I don't know how to do that.

These are my controller methods:

public function index($source)
{
    $source = strtolower($source);

    switch ($source) {
        case "csv":
            $file_csv = base_path('transactions.csv');
            $transactions = $this->csvToJson($file_csv);
            dd(gettype($transactions));
            return view('transactions', ['source' => $source, 'transactions' => $transactions]);
            break;
        case "db":
            $transactions = Transaction::all();
dd(gettype($transactions));
            return view('transactions', ['source' => $source, 'transactions' => $transactions]);
            break;
        default:
            abort(400, 'Bad sintax error.');
    }
}

function csvToJson($filename = '', $delimiter = ',')
{
    if (!file_exists($filename) || !is_readable($filename)) {
        return false;
    }
    $header = null;
    $data = array();
    if (($handle = fopen($filename, 'r')) !== false)
    {
        while (($row = fgetcsv($handle, 1000, $delimiter)) !== false)
        {
            if (!$header)
                $header = $row;
            else
                $data[] = array_combine($header, $row);
        }
        fclose($handle);
    }
    return $data;
}

As you can see, under the two cases I put a dd with a gettype function inside. In the first case I receive uncorrectly the response array, in the second one I receive correctly the response object.

The converted csv file should have this format:

[{"id":1,"code":"T_218_ljydmgebx","amount":"8617.19","user_id":375,"created_at":"2020-01-19T16:08:59.000000Z","updated_at":"2020-01-19T16:08:59.000000Z"},
{"id":2,"code":"T_335_wmhrbjxld","amount":"6502.72","user_id":1847,"created_at":"2020-01-19T16:08:59.000000Z","updated_at":"2020-01-19T16:08:59.000000Z"}]

Do you know how to convert the array transactions into a json object in the first case?


Solution

  • I don't know if there is any build-in solution on Laravel, but it can be done by PHP.

    I didn't test my code. So it might not work, or contain some typos, but I'm sure it will give you some directions.

    $cols = ["id","code","amount","user_id","created_at","updated_at"];
    $csv = file('folder/name.csv');
    $output = [];
    
    foreach ($csv as $line_index => $line) {
        if ($line_index > 0) { // I assume the the first line contains the column names.
            $newLine = [];
            $values = explode(',', $line);
            foreach ($values as $col_index => $value) {
                $newLine[$cols[$col_index]] = $value;
            }
            $output[] = $newLine;
        }
    }
    
    $json_output = json_encode($output);