Thomas Spade Thomas Spade - 4 months ago 35
PHP Question

PHP - Convert Tab Delimited TXT file to CSV

I'm trying to convert a tab delimited .txt file into a .csv file.

I was able to use fgetcsv() to open the txt file and get the data for each line with the following code:

$handle = fopen("fileurl.com", "r");
$row = 1;
if (($handle = fopen("fileurl.com", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, "\t")) !== 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";
}

print_r($data);

}
fclose($handle);
}


Now i just need to create a csv file from the data array. I've tried using fputcsv(), but haven't had any luck. I've tried something like this, but the csv file it creates isn't correct and only has 1 row:

$fp = fopen('file.csv', 'w');

fputcsv($fp, $data, "\t");

fclose($fp);


An example of how to create a .csv file from the $data array would be great. I've spent a lot of time researching and trying to get this figured out, but haven't been able to get it working.

Answer

fputcsv() only writes one line at a time. Not the whole file. You you need to loop through $data in order to add all of that data into your CSV file.

$fp = fopen('file.csv', 'w');
foreach ($data as $line) {
    fputcsv($fp, $line);
}
fclose($fp);

A full example using your code:

$handle = fopen("fileurl.com", "r");
$lines = [];
if (($handle = fopen("fileurl.com", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, "\t")) !== FALSE) {
        $lines[] = $data;
    }
    fclose($handle);
}
$fp = fopen('file.csv', 'w');
foreach ($lines as $line) {
    fputcsv($fp, $line);
}
fclose($fp);