Solved

php simple script

Posted on 2014-03-20
16
263 Views
Last Modified: 2014-05-26
Hi,

Have a csv file, need the output as below:

Input:
ID      Product Details
2500      PROD894,PROD888,PROD900,PROD23,PROD17
2501      PROD390
2502      PROD388
2503      PROD440,PROD433,PROD475
Output:      
ID      Product Details
2500      PROD894
2500      PROD888
2500      PROD900
2500      PROD23
2500      PROD17
2501      PROD390
2502      PROD388
2503      PROD440
2503      PROD443
2503      PROD475

Thanks
0
Comment
Question by:magento
  • 5
  • 3
  • 3
  • +3
16 Comments
 
LVL 11

Expert Comment

by:Amar Bardoliwala
ID: 39944519
Hello magento,

considering that your input file is as above INPUT format and its name is text.csv.

you can try something like following

<?php
$file = fopen("test.csv", "r");
$members = array();

$x = 0;

while (!feof($file)) {
   if($x > 0)
   {
   		$line = fgets($file);
		
		$line = preg_replace('!\s+!', ' ', $line);
		
		$arr_line = explode(' ', $line);
		
		$arr_prod = explode(',',$arr_line[1]);
		
		foreach($arr_prod as $key => $val)
		{
			if(trim($val) != '' && trim($arr_line[0]) != '')
			{
				echo $arr_line[0] . " " . $val . "<br />";
			}
		}
   }
   else
   {
   		$line = fgets($file);
   		echo "ID         Product Details<br/>";
   }
   $x++;
}

fclose($file);
?>

Open in new window


Hope this will help you.

Thank you.

Amar Bardoliwala
0
 
LVL 5

Author Comment

by:magento
ID: 39944527
Amar,

I tried the above but for some reason i didnt get the output.

This is the input file i have tried, can you please run and send me the output?

Thanks
test.csv
0
 
LVL 13

Expert Comment

by:duncanb7
ID: 39944533
Dear  magento,

you can try following code  and I tested it works , extraction is starting at after line of "ID      Product Details" , and I suppose the character  between "2500" and "PRODXXX" is space, otherwise you need to find out the exact delimiter for explode() function in php  if it is not a space between them

Duncan

<?php
$proverbs=file("input.csv");$cnt=count($proverbs);$kline=array();
for ($i=1;$i<$cnt;$i++){$mline=explode(",",$proverbs[$i]);$cnt_2=count($mline);
for($a=0;$a<$cnt_2;$a++){array_push($kline,trim($mline[$a],"\n")."\n");}}
$cnt=count($kline);
for ($a=0;$a<$cnt-1;$a++){
$mline=explode(" ",$kline[$a]);$next=explode(" ",$kline[$a+1]);
//echo $next[0]."=$a=".$mline[0]."===\n";
if ($next[0]>0){} else {$kline[$a+1]=$mline[0]." ".$kline[$a+1];}
}
file_put_contents("output.csv",$kline);
?>

Open in new window

0
Simplifying Server Workload Migrations

This use case outlines the migration challenges that organizations face and how the Acronis AnyData Engine supports physical-to-physical (P2P), physical-to-virtual (P2V), virtual to physical (V2P), and cross-virtual (V2V) migration scenarios to address these challenges.

 
LVL 11

Assisted Solution

by:Amar Bardoliwala
Amar Bardoliwala earned 125 total points
ID: 39944537
Hello magento,

Please check with code below

<?php
$file = fopen("test.csv", "r");
$members = array();

$x = 0;

while (!feof($file)) {
   if($x > 0)
   {
   		$arr_line = fgetcsv($file);
		
		$arr_prod = explode(',',$arr_line[1]);
		
		foreach($arr_prod as $key => $val)
		{
			if(trim($val) != '' && trim($arr_line[0]) != '')
			{
				echo $arr_line[0] . " " . $val . "<br />";
			}
		}
   }
   else
   {
   		$line = fgets($file);
   		echo "ID         Product Details<br/>";
   }
   $x++;
}

fclose($file);
?>

Open in new window


Hope this will help you.

Thank you.

Amar Bardoliwala
0
 
LVL 5

Author Comment

by:magento
ID: 39944541
Hi  Duncab7,

Its a csv file  so the delimiter is comma.

I have attached the csv file to previous post .

Not sure, my xampp was not running properly and hence i cant test it. Ca you pls run it and send me the output file. That would be great !!!

Thanks
0
 
LVL 13

Assisted Solution

by:duncanb7
duncanb7 earned 125 total points
ID: 39944546
in my code, I already take care of delimiter of comma "," as follows
$mline=explode(",",$proverbs[$i]);

I mean just make sure the char between 25xx and PRODxxx that is space rather
than other character  for doing math comparsion.

I tested the code it works and output the exact what you want with just simple code

please see all attached file

Duncan
input.csv
output.csv
junk.php
0
 
LVL 5

Author Comment

by:magento
ID: 39944569
Duncan ,

Sorry , since i have issue with xampp i cant test the code.

Can you please run the code for the attached file and send me the output?
test.csv
0
 
LVL 15

Assisted Solution

by:Insoftservice
Insoftservice earned 125 total points
ID: 39944584
Please try this one

<?php
$filename= "test.csv";
$val = file($filename);
$datadumper[] = "ID,Product Details\n";
if(!empty($val))
{
   foreach($val as $key=>$value)
   {
		$csvval = explode(',',trim($value,"\n"));
// echo '<pre>';print_r($csvval);
		if(($csvval[0]=="ID") || ($csvval[0] =='Product Details'))
		{
		 continue;
		}
		else
		{
		   $idval = $csvval[0];
		   unset($csvval[0]);
		   $dataval =  $csvval;
			if(is_array($dataval))
			{
			   foreach($dataval as $datakey=>$dataval)
			   {
			      $dataval = str_replace('"'," ",$dataval);
			      $dataprint= trim(trim($dataval),"\n");
			      $datadump[$idval][]= trim(trim($dataval),"\n");
				  $datadumper[] = "$idval,$dataprint\n";
			   } 
			}else
			{
			   $dump = trim($csvval,'"');
			   $dataprints= trim(trim($dump),"\n");

			   $datadump[$idval][] = $dump;
			   $datadumper[] = "$idval,$dataprints\n";

			}
   
		}

	}
}
echo "<pre>";print_r($datadumper);
file_put_contents("outputs.csv",$datadumper);
?>

Open in new window

0
 
LVL 11

Expert Comment

by:Amar Bardoliwala
ID: 39944586
Hello magento,

did u try my code?

It should work fine for u. you will see expected output in browser window.

Also you should put your test.csv file in same directory as your php file.

How are you running the code? in browser or from command line?

are you getting any error while running the code?

Thank you.

Amar Bardoliwala
0
 
LVL 15

Expert Comment

by:Insoftservice
ID: 39944591
Sorry forgot to paste the o/p.

                        $datadump[$idval][]= trim(trim($dataval),"\n");
line 26 is not required. You can run without that too.
outputs.csv
0
 
LVL 13

Expert Comment

by:duncanb7
ID: 39944616
Add back the first line of "ID PRODUCT Detail"

You input file format is different on this thread compared to the test.csv, that is
no "PROD", but it will be easier and simple

Please read the attached file

input.csv format is changed from input.csv to test.csv as you request
junk.php is changed to junk2.php

Be reminded your product detail data with " quote at start and end of second column string  such as "0,0,0,0"

Duncan

<?php
$proverbs=file("test.csv");
$cnt=count($proverbs);
$kline=array();
array_push($kline,$proverbs[0]);
for ($i=1;$i<$cnt;$i++){$mline=explode(",",$proverbs[$i]);$cnt_2=count($mline);
for($a=1;$a<$cnt_2;$a++){array_push($kline,$mline[0].",".str_replace('"',"",trim($mline[$a],"\n"))."\n");}}
$cnt=count($kline);
file_put_contents("output.csv",$kline);
 ?>

Open in new window

test.csv
junk2.php
output.csv
0
 
LVL 15

Expert Comment

by:Insoftservice
ID: 39944688
@magento please revert  whether given code is working as expected or not
0
 
LVL 9

Expert Comment

by:rinfo
ID: 39944883
this is my simple and crude code to achieve what you are trying to achieve.
test.php
result.txt
0
 
LVL 109

Accepted Solution

by:
Ray Paseur earned 125 total points
ID: 39945245
This appears to work OK.
http://iconoun.com/demo/temp_magento.php

Input file:
http://iconoun.com/demo/temp_magento.csv

Output file:
http://iconoun.com/demo/temp_magento.txt

Script file:
<?php //demo/temp_magento.php
error_reporting(E_ALL);

// WHERE TO SAVE THE OUTPUT
$new = 'temp_magento.txt';

// OPEN THE CSV FILE
$url = 'temp_magento.csv';
$fpr = fopen($url, 'r');
if (!$fpr) trigger_error("UNABLE TO OPEN $url", E_USER_ERROR);

// PREPARE AN OUTPUT DOCUMENT
$out = array();

// READ RECORDS FROM THE CSV FILE
while (!feof($fpr))
{
    $csv = fgetcsv($fpr);

    // NORMALIZE THE SECOND POSITION TO TRIM BLANKS AND EXTRANEOUS COMMAS
    $tmp = $csv[1];
    $tmp = trim($tmp);
    $tmp = trim($tmp, ',');

    // IF THE CSV DATA CONTAINS EMBEDDED COMMAS
    if (strpos($tmp, ','))
    {
        // EXPLODE THE DATA INTO AN ARRAY
        $tmp = explode(',', $tmp);
    }
    // IF NO EMBEDDED COMMAS
    else
    {
        // MAKE AN ARRAY WITH ONE DATA ELEMENT
        $tmp = array($tmp);
    }

    // USING THE ARRAY DATA, CREATE ONE LINE OF OUTPUT FROM EACH ELEMENT OF THE ARRAY
    foreach ($tmp as $str)
    {
        $out[] = $csv[0] . ' ' . $str . PHP_EOL;
    }
}

// WRITE THE OUTPUT DOCUMENT
file_put_contents($new, $out);

Open in new window

HTH, ~Ray
0
 
LVL 5

Author Comment

by:magento
ID: 39947648
Hi All,

First i apologies to everybody, still i am facing issue with my Xampp.

I dont know why the apache is not starting and only mysql is running in xampp admin.

Once rectified, i will check every one of the code and provide update.

Thanks,
0
 
LVL 5

Author Closing Comment

by:magento
ID: 40090790
Thanks for all ur kind help and apologies for the delay.
0

Featured Post

Comprehensive Backup Solutions for Microsoft

Acronis protects the complete Microsoft technology stack: Windows Server, Windows PC, laptop and Surface data; Microsoft business applications; Microsoft Hyper-V; Azure VMs; Microsoft Windows Server 2016; Microsoft Exchange 2016 and SQL Server 2016.

Question has a verified solution.

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

Suggested Solutions

These days socially coordinated efforts have turned into a critical requirement for enterprises.
Introduction This article is intended for those who are new to PHP error handling (https://www.experts-exchange.com/articles/11769/And-by-the-way-I-am-New-to-PHP.html).  It addresses one of the most common problems that plague beginning PHP develop…
The viewer will learn how to dynamically set the form action using jQuery.
The viewer will learn how to count occurrences of each item in an array.

820 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