Parsing files using PHP which has delimiter \t - php

IS there a way to parse the file(does not have extension) using PHP. The columns in the files are separated with tab(/t). I need to get each cells in a row with its contents.
I tried following methods
1) Converted(copied and pasted the contents and saved as a csv file) the file to
CSV and tried to read each row,but all the row contents came as a single row content.
$row = 1;
if (($handle = fopen("mynew.csv", "r")) !== FALSE) {
while (($row = fgetcsv($handle, 1000, "\t")) !== FALSE) {
$row++;
echo "******* <br />";
foreach ($row as $cell) {
echo $cell . "<br/>";
}
echo "******* <br />";
}
fclose($handle);
}
2) Tried to read the file by converting(copied and pasted as save as xls) to xls file. Here the entire column in each row as considered as one column. I used PHPExcel library here to read the contents.
Is there any work around to parse the contents of a file that has a no extension using PHP?

When reading file you never specify extension of that file. You can do this code to read extensionless file as CSV:
$row = 1;
if (($handle = fopen("testFile", "r")) !== FALSE) {
while (($row = fgetcsv($handle, 1000, "\t")) !== FALSE) {
$row++;
foreach ($row as $cell) {
echo $cell . "<br/>";
}
}
fclose($handle);
}

Related

Skip empty rows in reading csv excel file in php

I have a code where a csv file is uploaded ,the data is extracted from it and uploaded to database.Everything works fine,but how can i skip the empty rows and continue reading the rows with data in it.
This is the code where i extract data from csv file
if (($source = fopen( $csv_file, "r")) !== FALSE)
{
//read data from excel
while (($data = fgetcsv($source, 1000, ",")) !== FALSE)
{
$question=$data[0];
$point=$data[1];
$header=$data[2];
$footer=$data[3];
$type_value=$data[4];
$group_name=$data[5];
echo $question;
}// while end
}
If you use PHP's SplFileObject instead of the basic fgetcsv() function, it has built-in options to skip empty lines:
$file = new SplFileObject($csv_file);
$file->setFlags(SplFileObject::READ_CSV SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);
foreach ($file as $data) {
...
}
if ($data[0] == NULL)
continue;
This is because fgetcsv returns a non-empty array with a null element inside.
Try it with
if ($data === null) continue;
I didn't test it, but I sthink it should work.
Try this
if (($source = fopen( $csv_file, "r")) !== FALSE)
{
// read data from excel
while (($data = fgetcsv($source, 1000, ",")) !== FALSE)
{
if ((string) $data[0] != '0' and empty($data[0]))
{
continue;
}
$question = $data[0];
$point = $data[1];
$header = $data[2];
$footer = $data[3];
$type_value = $data[4];
$group_name = $data[5];
echo $question;
}
}

PHP convert CSV files into arrays and intersect

I have six CSV files that I want to convert into individual arrays and then intersect those arrays to see all of the values that are similar in each. I have this so far:
$directory = "/csv/CSS_AUDIT/";
if (! is_dir($directory)) {
exit('Invalid directory path');
}
$files = array();
foreach (scandir($directory) as $file) {
if ('.' === $file) continue;
if ('..' === $file) continue;
$files[] = $file;
$row = 1;
if (($handle = fopen("/csv/CSS_AUDIT/$file", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
$row++;
for ($r=0; $r < $num; $r++) {
echo $data[$r];
if (!empty($data[$r]))
echo "\n";
}
}
fclose($handle);
}
}
Right now it is looping through the files and giving me everything in one large array and I'm just kinda stuck. Any advice on how to achieve What I am trying to do?
If the files aren't too big, you can load them into an array and either check that such value doesn't exist in the array before adding to it, or running array_unique() when you're done. See this for a reference.
If the files are too big, you'll have to use some other more complicated and time-consuming methods (such as reading the (hopefully sorted) output each time before inserting new line).

How to call a image link with an id on php by using csv file

I have a csv file with id of the image and the link of the image.
I want to make a php script that call the id and open the suitable image of the id. Now I am using this code to show the csv file.
$row = 1;
if (($handle = fopen("file.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
print_r($data);
}
fclose($handle);
}
My csv file got only two columns
with ID and Image Link
Any idea how to do it?
This is what you need:
<?php
$row = 0;
if (($handle = fopen("file.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, "\t")) !== FALSE) {
if ($row > 0) {
if ($data[0] == '1234') echo $data[1];
}
$row++;
}
fclose($handle);
}
$data[0] will be your check for ID, $data[1] will be your image link. I have added the row check to exclude the first row as sounds like you have your first row as the heading.
Replace:
'ID_HERE'
With:
$_POST['id'];
//or
$_GET['id'];
// or however you get your id you want to check

write to a csv file

getHistory downloads a CSV file from Yahoo finance API, i am trying to get the CSV file, and insert the symbol infront of each of the entries in the file. After that is done i want to write the CSV file back to $symbol.csv. My data is the way i want it, i just cant seem to write it to a CSV file. What am i doing wrong? Or is there a better way to go about this?
$row = 1;
if (($handle = fopen(getHistory("T","2010-06-1"), "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
if($row = 1){array_unshift($data,"Symbol"); }
else { array_unshift($data, "T"); }
$fp = fopen('t.csv', 'w');
fputcsv($fp, $data);
fclose($fp);
$row++;
}
}
fclose($handle);
In your loop, you are opening and closing the file on each iteration. You should open the csv file before the loop, add to it, then close it when the loop is done.
Also, you should use === or == for comparisons.
$row = 1;
if (($handle = fopen(getHistory("T","2010-06-1"), "r")) !== FALSE) {
// This truncates the file to zero length
// so, we only need to do this once, before the loop
$fp = fopen('t.csv', 'w');
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
if($row === 1){array_unshift($data,"Symbol"); }
else { array_unshift($data, "T"); }
fputcsv($fp, $data);
$row++;
}
// Close it once we're all done
fclose($fp);
}
fclose($handle);

how to pass the two array?

The test.php directory is the same as csv and text file. now i want to pass all the csv file name and all the text name to the following if condition. namely, replace one.csv with all the csv file name. replace one.txt with all the txt file name.
if (($handle = fopen("one.csv", "r")) !== FALSE && ($handle2 = fopen("one.txt", 'a')) !== FALSE) { ...}
the following is my code. after run the code,i found all the content in the text file are the same. it loops too many times. how to change the code?thank you.
$files = glob("./*.csv");
$files1 = glob("./*.txt");
foreach($files as $filepath){
foreach($files1 as $filepath1){
$row = 1;
if (($handle = fopen("one.csv", "r")) !== FALSE && ($handle2 = fopen("one.txt", 'a')) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if($row > 1) {
$url = $data[8];
foreach($result[0] as $url){
fwrite($handle2, $url."\r\n");
}
}
$row++;
}
fclose($handle);
fclose($handle2);
}
}
}
The txt file is empty. now, i want to read the csv file and extract some content of it then put them into the text file. thank you
You don't need to glob .txt files, just glob csv, and replace the extension .csv by .txt
$csv = glob('./*.csv');
foreach($csv as $file) {
$txt = preg_replace('#\.csv$#', '.txt', $file);
if (($handle = fopen($file, "r")) !== FALSE && ($handle2 = fopen($txt, 'a')) !== FALSE) {
//your code...
}
}
The problem is that you've got a loop within a loop. So every time the first loop loops it's doing everything in the second loop AGAIN.
Try something like this:
$csv_files = glob("./*.csv");
$txt_files = glob("./*.txt");
$csvs = array();
foreach($csv_files as $fp){
$csvs[] = fopen($fp, "r");
}
$txts = array();
foreach($txt_files as $fp){
$txts[] = fopen($fp, "r");
}
var_dump($csvs); // all csv file info
var_dump($txts); // all txt file info
You can test to see !== false in the separate loops if you wish. Otherwise, if you just want to use them then you can loop through the separate arrays and get the info out of them that way.

Categories