Utilisez PHP pour supprimer les lignes en double dans un fichier .txt

J’ai plusieurs fichiers txt avec un répertoire. Les fichiers texte contiennent tous le même en-tête. Je lis tous les fichiers txt et les envoie tous dans un seul fichier.

Étant donné que chaque fichier individuel contient le même en-tête, il les insère tous dans le nouveau fichier fusionné. Comment puis-je supprimer tous les en-têtes du nouveau fichier fusionné et en laisser un juste en haut?

J’ai regardé la commande de sorting sous Unix.

sort filename | uniq 

Cette commande fonctionne, mais supprime toutes les autres données en double. Y a-t-il un moyen de supprimer uniquement la chaîne spécifique “Ceci est un en-tête” mais en laisser un en haut?

Code actuel

 $header = array( "XX-XXXXXXXXX-XXXXXXX-X XXXXXXXXXXXX" ); $files = glob( "/path/to/folder/*.txt" ); $output_file = "newfile_".date( "YmdHis" ).".txt"; $out = fopen( $output_file, "w" ); foreach( $header as $inputHeader ) { fwrite( $out, $inputHeader ); } foreach( $files as $file ) { $in = fopen( $file, "r" ); while ( $line = fgets( $in ) ) { if( $header !== $line ) { fwrite( $out, $line ); } } fclose( $in ); } fclose( $out ); 

La ligne qui est dupliquée plusieurs fois Ceci est le duplicata

Après avoir créé votre nouveau fichier, ajoutez cette ligne, cela supprimera la ligne dupliquée.

 $lines = array_unique(file("your_file.txt")); 

Essayez de saisir l’en-tête au début de l’écriture, puis vérifiez-le ultérieurement lorsque vous lisez les lignes.

 //cache our header lines $header = "Header line"; $files = glob( "/path/to/files*.txt" ); //print_r($files); $output_file = "newfile".date( "YmdHis" ).".txt"; $out = fopen( $output_file, "w" ); //input the header line at the top of our new file fwrite( $out, $header); foreach( $files as $file ) { $in = fopen( $file, "r" ); while ( $line = fgets( $in ) ) { //header check, dont output header lines to new file if($header !== preg_replace('/\s+/', '', $line)){ fwrite( $out, $line ); } } fclose( $in ); } fclose( $out ); 

J’ai donc réussi à corriger le problème avec l’aide de @ WillParky93. J’ai eu 4 en-têtes différents dans le fichier avec tous les doublons. après avoir joué avec les opérateurs logiques.

Code final

 //the headers that were in the file with duplicates $header1 = "DD-LLDRHD045-UHSTAYL-MR LOCKFMDLA111; $header2 = "DD-LLDRHD045-UHSTAYL-MR LOCKFMDLA222"; $header3 = "DD-LLDRHD045-UHSTAYL-MR LOCKFMDLA333"; $header4 = "DD-LLDRHD045-UHSTAYL-MR LOCKFMDLA444"; //get all the files to be merged $files = glob( "/PATH/TO/FILES/*.txt" ); //set the output filename $output_file = "NewFile".date( "YmdHis" ).".txt"; //open the output file $out = fopen( $output_file, "w" ); //loop through the files to be merged foreach( $files as $file ) { //open each file $in = fopen( $file, "r" ); //while each line in each file while ( $line = fgets( $in ) ) { //if the current line is not equal to header1, header2, header3 or header4 if( preg_replace('/\s+/', '', $line ) != preg_replace('/\s+/', '', $header1 )&& preg_replace('/\s+/', '', $line ) != preg_replace('/\s+/', '', $header2 )&& preg_replace('/\s+/', '', $line ) != preg_replace('/\s+/', '', $header3 )&& preg_replace('/\s+/', '', $line ) != preg_replace('/\s+/', '', $header4 ) ) { //write that line to the output file fwrite( $out, $line ); //echo $line."\n"; }else{ //write blank line to the file fwrite( $out, "\n" ); } } //close the file fclose( $in ); } //close the output file fclose( $out ); //get the contents of the output file $header1 .= file_get_contents( $output_file ); //add the header to the top of the output file file_put_contents( $output_file, $header1 ); 

si le fichier n’a que 1 en-tête

 $header_exist = false; foreach($files as $file) { $in = fopen($file, "r"); while($line = fgets($in)) { if(strpos($line, "This is a header") === false) { fwrite($out, $line); } else { if($header_exist === false) { $header_exist = true; fwrite($out, $line); } } } fclose($in); }