William
William

Reputation: 1069

open multiple files and write its data into one file including line break

I have multiple .m3u files containing strings like:

string1
string2 etc //(with the line break)

I want to add this information into one file but when it gets to the end of a file, add a line break. Because when i do the code it works but when it connects the next file i get results like:

string10
string11string12
string13

I want to prevent this and add everything to new line. Code below:

<?PHP
//File path of final result
$longfilepath = "/var/lib/mpd/playlists/";

$filepathsArray = [$longfilepath."00's.m3u",$longfilepath."50's.m3u",$longfilepath."60's.m3u",$longfilepath."70's.m3u",$longfilepath."80's.m3u",$longfilepath."90's.m3u",$longfilepath."Alternative Rock.m3u",$longfilepath."Best Of Irish.m3u",$longfilepath."Blues.m3u",$longfilepath."Chart Hits.m3u",$longfilepath."Christmas.m3u",$longfilepath."Classic Rock.m3u",$longfilepath."Classical Opera.m3u",$longfilepath."Country.m3u",$longfilepath."Dance.m3u",$longfilepath."Disco.m3u",$longfilepath."Easy Listening.m3u",$longfilepath."Electric Rock.m3u",$longfilepath."Hard Rock.m3u",$longfilepath."Irish Country.m3u",$longfilepath."Jazz.m3u",$longfilepath."Live and Acoustic.m3u",$longfilepath."Love Songs.m3u",$longfilepath."Pop.m3u",$longfilepath."Rap and RnB.m3u",$longfilepath."Reggae.m3u",$longfilepath."Relaxation.m3u",$longfilepath."Rock and Roll.m3u",$longfilepath."Rock.m3u",$longfilepath."Soul.m3u",$longfilepath."Soundtracks.m3u",$longfilepath."Top Bands.m3u"];
$filepath = "mergedfiles.txt";

$out = fopen($filepath, "w");
//Then cycle through the files reading and writing.

foreach($filepathsArray as $file){
  $in = fopen($file, "r");
  while ($line = fgets($in)){
       fwrite($out, $line."\n"); //My attempt to add new line (which works) but then adds an extra for those that dont need it.
  }
  fclose($in);
}

//Then clean up
fclose($out);
?>

I use:

fwrite($out, $line."\n");

but then i get results like:

string1

string2
string3

string4

string5

Upvotes: 1

Views: 416

Answers (2)

AbraCadaver
AbraCadaver

Reputation: 78994

This might be easier:

$out = array();
foreach($filepathsArray as $file) {
    $out = array_merge($out, file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));
}
file_put_contents($filepath, implode("\n", $out));
  • Read the files into an array ignoring newlines and empty lines
  • Implode the array using newlines and write to the final file

Note: You may need to implode on \r\n to see the newline in some Windows applications like notepad.

Upvotes: 1

u_mulder
u_mulder

Reputation: 54841

Before adding your own linebreak - remove all linebreaks that can be in a string with trim (or even empty lines):

foreach($filepathsArray as $file){
  $in = fopen($file, "r");
  while ($line = fgets($in)) {
       $line = trim($line);
       if ($line) {
           // if line is not empty - write it to a file
           fwrite($out, $line . "\n");
       }
  }
  fclose($in);
}

Upvotes: 2

Related Questions