1. <?php
  2. /**
  3. * Parses data from datasets with optional flags.
  4. *
  5. * @param string $dataset_path Path to the dataset file.
  6. * @param array $options An array of optional parameters.
  7. * - 'delimiter' : Delimiter used in the dataset (default: ',').
  8. * - 'header' : Whether the dataset has a header row (default: true).
  9. * - 'skip_rows' : Number of rows to skip at the beginning (default: 0).
  10. * - 'data_type' : Data type of the columns ('string', 'int', 'float'). Default: 'string'.
  11. *
  12. * @return array|false An array of data rows, or false on error.
  13. */
  14. function parseDataset(string $dataset_path, array $options = []): array|false
  15. {
  16. // Default options
  17. $delimiter = $options['delimiter'] ?? ',';
  18. $header = $options['header'] ?? true;
  19. $skip_rows = $options['skip_rows'] ?? 0;
  20. $data_type = $options['data_type'] ?? 'string';
  21. // Validate data type
  22. if (!in_array($data_type, ['string', 'int', 'float'])) {
  23. error_log("Invalid data_type. Must be string, int, or float.");
  24. return false;
  25. }
  26. $data = [];
  27. // Open the file
  28. if (($handle = fopen($dataset_path, 'r')) === false) {
  29. error_log("Could not open file: " . $dataset_path);
  30. return false;
  31. }
  32. // Skip header rows
  33. if ($header) {
  34. fgetcsv($handle, 0, $delimiter); // Skip header row
  35. }
  36. // Skip specified rows
  37. for ($i = 0; $i < $skip_rows; $i++) {
  38. fgetcsv($handle, 0, $delimiter);
  39. }
  40. // Read data rows
  41. while (($row = fgetcsv($handle, 0, $delimiter)) !== false) {
  42. // Convert data types
  43. $typed_row = [];
  44. foreach ($row as $value) {
  45. if ($data_type == 'int' && is_numeric($value)) {
  46. $typed_row[] = (int) $value;
  47. } elseif ($data_type == 'float' && is_numeric($value)) {
  48. $typed_row[] = (float) $value;
  49. } else {
  50. $typed_row[] = $value;
  51. }
  52. }
  53. $data[] = $typed_row;
  54. }
  55. fclose($handle);
  56. return $data;
  57. }
  58. ?>

Add your comment