PHP fgetcsv Distinct Column Values

Hello,

I have the code below and I am able to view my csv file.

I have the value '$dealer_identifier_column' and what I need to do is to pull the distinct values of that column in the csv file and echo them.

The csv files can have 5 different dealers on them so I really need to seporate it and only use the one that I need for the task.

$row = 1;
	if (($handle = fopen($full_file_path, "r")) !== FALSE) {
		while (($data = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
			$num = count($data);
			echo "<p> $num fields in line $row: <br /></p>\n";
			$row++;
			for ($c=0; $c < $num; $c++) {
				echo $data[$c] . "<br />\n";
			}
		}
		fclose($handle);
	}

Open in new window

LVL 1
movieprodwAsked:
Who is Participating?
 
Ray PaseurConnect With a Mentor Commented:
No, I don't see anything wrong with it, and if it works, that's great.  However the code does not match the data set posted here, since the delimiter is not a double quote, but instead a semi-colon.  Here is a tested and working code sample using the test data set.
http://iconoun.com/demo/temp_movieprodw.php

<?php // demo/temp_movieprodw.php

/**
 * See http://www.experts-exchange.com/Programming/Languages/Scripting/PHP/Q_28602334.html
 */
error_reporting(E_ALL);

$url = 'http://filedb.experts-exchange.com/incoming/2015/01_w04/894064/dcmotors-s.csv';
$fpr = fopen($url, 'r');
if (!$fpr) trigger_error("FAILED TO OPEN $fpr", E_USER_ERROR);

// WHAT IS THE SIGNAL OF THE DESIRED COLUMN?
$sig = '#DealerId';

// GET THE TOP ROW
$top = fgetcsv($fpr, 0, ';');

// GET THE POINTER TO THE SIGNAL
$set = FALSE;
foreach ($top as $ptr => $str)
{
    if ($sig == $str)
    {
        $set = TRUE;
        break;
    }
}
if (!$set) trigger_error("SIGNAL STRING $sig NOT FOUND IN TOP ROW OF $fpr", E_USER_ERROR);

// NOW $ptr POINTS TO THE ARRAY POSITION WE WANT
while (!feof($fpr))
{
    $arr = fgetcsv($fpr, 0, ';');
    if (empty($arr[$ptr])) continue;
    $out[$arr[$ptr]] = $arr[$ptr];
}

// SHOW THE WORK PRODUCT
echo '<pre>';
echo PHP_EOL . "UNIQUE VALUES FOR $sig IN COLUMN $ptr OF $url";
echo PHP_EOL;
print_r(array_values($out));

Open in new window

0
 
Dave BaldwinFixer of ProblemsCommented:
"distinct values" is usually a server function like in MySQL.  A CSV file is just that, a file, with no coding attached to it.  If the values you are looking for are scattered throughout the file, you may have to read the whole file in, sort it by the field you want, then scan it to find out where it changes to get the 'distinct' values.
0
 
Ray PaseurCommented:
Please show us the test data set (your CSV file).  Once we can see that, we can give you a tested and working code example.  You don't have to post confidential data or a lot of data, just the minimum SSCCE needed for us to give you a demonstration.
0
Cloud Class® Course: Python 3 Fundamentals

This course will teach participants about installing and configuring Python, syntax, importing, statements, types, strings, booleans, files, lists, tuples, comprehensions, functions, and classes.

 
movieprodwAuthor Commented:
Hello,

I will let you know what I want to do so you can get a glimpse of my issue.

- I have about 40 clients that ftp me data and there are about 10 formats that they are sending, I have tried for years to get them to send me the same formats but they never do.

- I wanted to create a tool that I can go in and setup all of their accounts with their data info so I can import them. I currently have to create a special php file that handles each one, it is getting ridiculous and I don't want to do that anymore.

Attached is the csv example and #DealerId is the column I want to find the info off.  I was thinking that if I could get that column in an array then I could sort it then find the distinct/unique ones

This is the code I am using to echo the entire csv file, hope this helps.

$row = 1;
	if (($handle = fopen($full_file_path, "r")) !== FALSE) {
		while (($data = fgetcsv($handle, 0, $delimiter, '"')) !== FALSE) {
			$num = count($data);
			for ($c=0; $c < $num; $c++) {
				echo $data[$c] . "<br />\n";
			}
		}
		fclose($handle);
	}

Open in new window

dcmotors-s.csv
0
 
movieprodwAuthor Commented:
I used this and it works.

Do you see anything wrong with this?

$handle = fopen($full_file_path, 'r');
	$headers = fgetcsv($handle, 0, $delimiter, '"');
	
	while ($line = fgetcsv($handle, 0, $delimiter, '"')) {
		$line = array_combine($headers, $line);
		$did_array[] = $line[$dealer_identifier_column];
	} 
	$did_unique = array_unique($did_array);

Open in new window

0
 
movieprodwAuthor Commented:
Thanks Ray,

There are several files so that one worked for the one I was using.

Matt
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.