Solved

PHP fgetcsv Distinct Column Values

Posted on 2015-01-23
6
370 Views
Last Modified: 2015-01-23
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

0
Comment
Question by:movieprodw
  • 3
  • 2
6 Comments
 
LVL 83

Expert Comment

by:Dave Baldwin
ID: 40566030
"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
 
LVL 109

Expert Comment

by:Ray Paseur
ID: 40566176
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
 
LVL 1

Author Comment

by:movieprodw
ID: 40566678
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
Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
LVL 1

Author Comment

by:movieprodw
ID: 40566919
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
 
LVL 109

Accepted Solution

by:
Ray Paseur earned 500 total points
ID: 40567533
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
 
LVL 1

Author Closing Comment

by:movieprodw
ID: 40567808
Thanks Ray,

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

Matt
0

Featured Post

Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Wordpress French and English Site 6 74
Extracting store locations from Google maps or site 2 21
Wordpress Pagination 1 28
Showing multiple maps using PHP and Google Maps 8 19
This article will explain how to display the first page of your Microsoft Word documents (e.g. .doc, .docx, etc...) as images in a web page programatically. I have scoured the web on a way to do this unsuccessfully. The goal is to produce something …
This article discusses four methods for overlaying images in a container on a web page
The viewer will learn how to look for a specific file type in a local or remote server directory using PHP.
The viewer will learn how to create a basic form using some HTML5 and PHP for later processing. Set up your basic HTML file. Open your form tag and set the method and action attributes.: (CODE) Set up your first few inputs one for the name and …

789 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question